PDA

View Full Version : فرق e.SuppressKeyPress با e.Handled



Saylar
یک شنبه 23 فروردین 1394, 13:56 عصر
با سلام

می خواستم بدانم در عمل فرق e.SuppressKeyPress با e.Handled در چیست ؟؟؟

Saylar
یک شنبه 23 فروردین 1394, 16:58 عصر
هیچکس اطلاعی ندارد !؟

Mani_rf
یک شنبه 23 فروردین 1394, 22:22 عصر
سوالت رو خیلی بد مطرح کردی. بهتر نیست یکمی دقیقتر میگفتی که این کد رو کجا دیدی و یک نمونه از کاربرد 2تاش رو میگذاشتی تا میتونستیم ببینیم دقیقا منظرت کجاست؟

Saylar
یک شنبه 23 فروردین 1394, 23:07 عصر
اگر در رویداد کی دان کنترل تکست باکس کد زیر را بنویسیم

130284
همان کاری را می کند که اگر در رویداد کی پرس تکست باکس کد زیر را بنویسیم

130285

آیا این موازی کاری در ویژوال استودیو هست !؟ یا در عمل فرقی باهم دارند ؟!

محمد آشتیانی
دوشنبه 24 فروردین 1394, 00:18 صبح
سلام
ببینید دوست عزیز ، ترتیب اتفاق افتادن رویدادهای کیبورد به این شکل هست


KeyDown
هنگامی که یک کلید فشرده میشه اتفاق میفته و تا زمانی که کلید فشرده نگه داشته شده بصورت متوالی اتفاق میفته


KeyPress
این رویداد هم مثل رویداد قبلی هست ، با این تفاوت که کلید های کنترلی در نظر گرفته نمیشن (یعنی فقط کلید هایی که منجر به ورود کاراکتر به کنترل هایی مثل TextBox میشن در این رویداد پردازش میشن)


KeyUp
این رویداد هم به محض اینکه کلید رها بشه اتفاق میفته


این توضیحات رو دادم تا قضیه روشن بشه ، حالا وقتی شما تو رویداد KeyDown مربوط به تکست باکستون می نویسید e.Handled = True ، این باعث نمیشه اون کلید در رویداد KeyPress پردازش نشه و همچنان شما اون کاراکتر رو در تکست باکستون خواهید داشت ، در واقع e.Handled = True باعث از بین رفتن پیغام WM_CHAR که با فشرده شدن کلید ایجاد شده ، از صف پیغام ها نمیشه و همچنان این کلید در رویداد های بعدی که بالاتر ذکر کردم مورد پردازش قرار میگیره.
اما وقتی شما در رویداد KeyDown از e.SuppressKeyPress = True استفاده می کنید ، به محض فشرده شدن کلید کلا پیغام (های) WM_CHAR رو از بین میبره و اساسا رویداد های بعدی اصلا اتفاق نمیفتن.


با توجه به صحبت های بالا ، اگر شما به شکل زیر در رویداد KeyDown بنویسید ، باعث فیلتر شدن ورودی کیبورد در تکست باکس شما نمیشه (مگر اینکه همین رو عینا در رویداد KeyPress هم بنویسید - البته باز هم پیغام WM_CHAR سرجای خودش خواهد بود)

Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
e.Handled = True
End Sub




اما در این نمونه با فشردن کلید ، هیچ اتفاقی نمیفته

Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
e.SuppressKeyPress = True
End Sub



یه مثال (کاربرد) ساده هم از این رویداد این میتونه باشه
با زدن کلید Enter ، وقتی فوکوس روی تکست باکس هست ، صدای بیپ سیستم پخش میشه ، به سادگی برای فیلتر کردن این اتفاق ، میتونید این کد رو استفاده کنید (البته با همون e.Handled هم میشه انجامش داد ، ولی نه به سادگی این روش)

Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
If e.KeyCode = Keys.Enter Then
e.SuppressKeyPress = True
End If
End Sub



موفق باشید.