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

اگر بخواهید یکی از رویدادهای مربوط به فشرده شده دکمه‌های کیبورد را کنترل کنید باید رویدادهای 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 استفاده کنیم.