رویدادهای کیبورد

اگر بخواهید یکی از رویدادهای مربوط به فشرده شده دکمه های کیبورد را کنترل کنید باید رویدادهای KeyPress، KeyDown و KeyUp را کنترل کنید.

به عنوان مثال یک رویداد KeyPress را به فرم اضافه می کنیم به طوریکه هر زمانی که یکی از دکمه های کیبورد فشرده شد مقدار آن با خاصیت Text کنترل Lable اضافه شود. یک برنامه ویندوزی جدید ایجاد کنید و نام آن را KeyBoardEvents بگذارید.سپس یک کنترل Label به آن اضافه نمایید.
keyboard-events-01
خاصیت Text کنترل Lable را پاک کنید. بر روی کنترل form کلیک کرده و از پنجره Properties رویداد KeyPress را یافته و بر روی آن دو بار کلیک کنید تا یک کنترل کننده رویداد ایجاد شود. در داخل کنترل کننده رویداد Form1_KeyPress کد زیر را وارد کنید:

   1: using System;                                                                                                                  
   2: using System.Windows.Forms;                                                                                                    
   3:                                                                                                                                                           
   4: namespace KeyBoardEvents                                                                                                       
   5: {                                                                                                                                                         
   6:     public partial class Form1 : Form                                    
   7:     {                                                                                                                                                     
   8:         //Variable to count letters for simple word wrap                                                                      
   9:         private int charCount = 0;                                                                                             
  10:                                                                                                                                                           
  11:         public Form1()                                                                                                         
  12:         {                                                                                                                                                 
  13:             InitializeComponent();                                                                                                                        
  14:         }                                                                                                                                                 
  15:                                                                                                                                                           
  16:         private void Form1_KeyPress(object sender, KeyPressEventArgs e)  
  17:         {                                                                                                                                                 
  18:             charCount++;                                                                                                                                  
  19:                                                                                                                                                           
  20:             //Go to next line after the line's 30th character                                                                 
  21:             if (charCount > 30)                                                                                                
  22:             {                                                                                                                                             
  23:                 label1.Text += "rn";                                                                                                                    
  24:                 charCount = 0;                                                                                                                            
  25:             }                                                                                                                                             
  26:             else                                                                                                               
  27:             {                                                                                                                                             
  28:                 //Append the pressed keyboard key to the label using KeyChar property                                         
  29:                 label1.Text += e.KeyChar;                                                                                                                 
  30:             }                                                                                                                                             
  31:         }                                                                                                                                                 
  32:     }                                                                                                                                                     
  33: }

رویداد KeyPress هر وقت که یکی از دکمه های کیبورد فشرده شود اتفاق می افتد. در خط 9 یک متغیر به نام charCount تعریف و مقدار دهی اولیه شده است و از آن برای تشخیص تعداد کاراکترهای خط جاری و رفتن به خط بعد استفاده می شود. کنترل کننده رویداد تعداد کاراکترهای تایپ شده را به وسیله افزایش یک واحدی charCount در خط 18 تشخیص می دهد. در خط 21 تست می شود که آیا مقدار charCount از 30 بیشتر است یا نه؟ اگر بیشتر بود، یک خط جدید با استفاده از دستور “rn” ایجاد و بقیه کاراکترها تایپ شده در آن نمایش داده می شوند. سپس در خط 23 بار دیگر مقدار charCount را به دلیل اینکه در ابتدای یک خط جدید هستیم، صفر می کنیم . اگر مقدار charCount کوچکتر یا مساوی 30 باشد، به سادگی کاراکتر تایپ شده توسط کاربر با استفاده از خاصیت KeyPressEventArgs.KeyChar به متن اضافه می شود. حال برنامه را اجرا کنید. مشاهده می کنید که با زدن هر دکمه کیبورد، متن کنترل lable تغییر کرده و کاراکترهایی را که شما وارد می کنید به آن اضافه می شود. وقتی که رویدادهای KeyDown و KeyUp را کنترل می کنید، می توانید از آرگومان KeyEventArgs که شامل خاصیت های زیادی درباره دکمه فشرده شده است استفاده نمایید. خواص این آرگومان به شرح زیر است :

خاصیت توضیح
Alt تشخیص می دهد که آیا دکمه Alt فشرده شده است یا نه؟
Control تشخیص می دهد که آیا دکمه Control فشرده شده است یا نه؟
KeyCode کد اسکی دکمه فشرده شده را می گیرد. و با استفاده از آن تشخیص می دهد که دکمه خاصی فشرده شده است یا نه؟
KeyData بسیار شبیه به خاصیت KeyCode است با این تفاوت که فشرده شدن دکمه های ترکیبی را نیز تشخیص می دهد.
KeyValue مقدار عددی دکمه فشرده شده را بر می گرداند.
Modifier تشخیص می دهد که کدام دکمه های ترکیبی (SHIFT, CTRL, ALT) فشرده شده اند؟
Shift می گوید که آیا دکمه Shift فشرده شده است یا نه؟
SuppressKeyPress به شما اجازه می دهد که از ورود اطلاعات از طریق کیبورد توسط کاربر جلوگیری کنید.

به عنوان مثال در کد زیر از خاصیت SupressKeyPress استفاده شده است که در آن فقط اجازه ورود اعداد به کاربر داده شده است (کاربر نمی تواند هیچ کاراکتر و یا یا نشانه ای را وارد کند). یک کنترل text box را به فرمتان اضافه کرده و یک کنترل کننده رویداد را به رویداد KeyDown اضافه نمایید.

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (!(e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9 && !e.Shift))
    {
        e.SuppressKeyPress = true;
    }
}

شرط داخل دستور if می گوید که اگر دکمه تایپ شده توسط کاربر یک دکمه غیر عددی بود یا کلید shift فشرده شد، توسط خاصیت SuppressKeyPress نادیده گرفته شود. خاصیت KeyCode که از آن در شرط استفاده کرده ایم شامل مقادیری از نوع شمارشی Keys است. دکمه های عددی به وسیله مقایر D0 تا D9 نمایش داده شده اند. در ضمن لازم است که چک کنیم که آیا دکمه Shift فشرده شده است یا نه؟ از آنجاییکه نتیجه فشردن دکمه Shift همرا با یک عدد ممکن است منجر به تولید یک علامت مثلا @ (ترکیب دکمه Shift و عدد 2 ) شود بنابراین باید از خاصیت Shift کلاس KeyEventArgs استفاده کنیم.

لطفا اگر نظر، پیشنهاد و یا انتقادی در باره مطلب بالا دارید در قسمت زیر و اگر سوالی دارید در بخش پرسش و پاسخ مطرح بفرمایید.

  1. pooya78.me پاسخ دادن

    سلام.خسته نباشید.آموزش هاتون فوق العاده هستن
    فقط بی زحمت HScrollBar و VScrollBar رو هم آموزش بدید.به شدت به این ها نیاز دارم اما هیچ جا آموزشی پیدا نکردم
    با تشکر فراوان از زحماتتون

    • یونس ابراهیمی پاسخ دادن

      سلام ، مرسی دوسته .
      باشه حتما یک آموزش از این کنترل ها تهیه می کنیم.