1. 程式人生 > >Winform下KeyDown,KeyPress,KeyUp事件的總結

Winform下KeyDown,KeyPress,KeyUp事件的總結

原文連結:http://www.cnblogs.com/xiashengwang/archive/2011/09/15/2578798.html

在winform程式中,經常會用到這幾個事件用於控制數字輸入,按鍵動作等操作,但一直沒有完全弄清楚他們之間的區別和聯絡,到底什麼時候用哪一個事件合適,閒暇無事,做了一個小小的總結,以免以後犯糊塗。

1) 這三個事件呼叫的先後順序(MSDN)

   1. KeyDown    :在控制元件有焦點的情況下按下鍵時發生

     2. KeyPress   :在控制元件有焦點的情況下按下鍵時發生。

     3. KeyUp         :在控制元件有焦點的情況下釋放鍵時發生。

2) KeyDown和KeyPress在MSDN上的解釋完全一樣,都是在按下鍵的時候發生,那區別是什麼呢?

    textBox1_KeyDown(object sender, KeyEventArgs e)  
    textBox1_KeyPress(object sender, KeyPressEventArgs e)  
    textBox1_KeyUp(object sender, KeyEventArgs e)  

從時間函式傳入的事件引數可以看出,KeyDown和KeyUp用的是KeyEventArgs,KeyPress 用的是KeyPressEventArgs。

查閱MSDN,KeyEventArgs 提供了KeyCode,KeyData等System.Windows.Forms.Keys裡定義的列舉。如下:

    using System;  
    using System.ComponentModel;  
    using System.Drawing.Design;  
    using System.Runtime.InteropServices;  
      
    namespace System.Windows.Forms  
    {  
        // 概要:  
        //     Specifies key codes and modifiers.  
        [Flags]  
        [ComVisible(true)]  
        [TypeConverter(typeof(KeysConverter))]  
        [Editor("System.Windows.Forms.Design.ShortcutKeysEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]  
        public enum Keys  
        {  
            // 概要:  
            //     The bitmask to extract modifiers from a key value.  
            Modifiers = -65536,  
            //  
            // 概要:  
            //     No key pressed.  
            None = 0,  
            //  
            // 概要:  
            //     The left mouse button.  
            LButton = 1,  
            //  
            // 概要:  
            //     The right mouse button.  
            RButton = 2,  
            //  
            // 概要:  
            //     The CANCEL key.  
            Cancel = 3,  
            //  
            // 概要:  
            //     The middle mouse button (three-button mouse).  
            MButton = 4,  
            //  
            // 概要:  
            //     The first x mouse button (five-button mouse).  
            XButton1 = 5,  
            //  
            // 概要:  
            //     The second x mouse button (five-button mouse).  
            XButton2 = 6,  
            //  
            // 概要:  
            //     The BACKSPACE key.  
            Back = 8,  
            //  
            // 概要:  
            //     The TAB key.  
            Tab = 9,  
            //  
            // 概要:  
            //     The LINEFEED key.  
            LineFeed = 10,        
            //  
            // 概要:  
            //     The CAPS LOCK key.  
            Capital = 20,  
            //內容太多了,略去。。。。。。  
            // 概要:  
            //     The ALT modifier key.  
            Alt = 262144,  
        }  
    }  

KeyPressEventArgs裡自只定義了個KeyChar,並且是char型的。因此:

----要處理與按鍵相關的操作只能在KeyDown裡處理,如是否按了Ctrl鍵或是同時按下了Ctrl+A鍵,諸如此類的按鍵判斷都應該在KeyDown裡處理。(KeyUp也能獲得按鍵資訊,不過是在按鍵上升是觸發
    private void textBox1_KeyDown(object sender, KeyEventArgs e)  
    {  
       //是否安了鍵盤的A鍵  
        if (e.KeyCode == Keys.A)  
        {  
        }  
    }  

----要處理具體按下後的輸出字元要用KeyPresss事件,比如驗證是不是輸入了數字,判斷Ascii碼即可。
    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)  
    {  
        if (e.KeyChar >= '0' && e.KeyChar <= '9')  
        {  
        }  
    }  

在KeyDown裡可以判斷是不是按了數字鍵來判斷,但是要同時判斷鍵盤上的數字和小鍵盤的數字,不太可取。
    private void textBox1_KeyDown(object sender, KeyEventArgs e)  
    {  
        if((e.KeyCode >= Keys.D0 && e.KeyCode <=Keys.D9) ||  
            (e.KeyCode>= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9))  
        {  
        }  
    }  

3)取消使用者輸入應該用什麼方法?

不要使用者輸入數字以外的字元,已經輸入的字元如何取消呢?答案是可以在KeyPress裡取消,也可以在KeyDown裡取消。

1, KeyPress裡取消輸入 (A不能輸入)

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)  
    {  
        if (e.KeyChar == 'A')  
        {  
            e.Handled = true;  
        }  
    }  

2,KeyDown裡取消輸入 (A不能輸入)
    private void textBox1_KeyDown(object sender, KeyEventArgs e)  
    {  
        if (e.KeyCode == Keys.A)  
        {  
            e.SuppressKeyPress();  
        }  
    }  

SuppressKeyPress方法可以取消KeyPress事件,注意此時KeyUp事件也被取消了(實驗得知)。

4)關於KeyDown和KeyUp

 KeyDown觸發幾次KeyUp就觸發幾次。

1,按鍵盤的A鍵,KeyDwon和KeyUp各觸發一次。

KeyDown裡的KeyEventArgs的值如下:(注意:KeyCode,Keydata,KeyValue裡的值是虛擬碼,不一定和程式吻合,只是為了說明問題)

KeyCode:Keys.A

KeyData:Keys.A

KeyValue:65

KeyUp裡的KeyEventArgs的值和KeyDown相同。

2,按鍵盤的Ctrl+A,KeyDwon和KeyUp個觸發兩次。

第一次KeyDown裡的KeyEventArgs的值如下:

KeyCode:Keys.ContrlKey

KeyData:Keys.ContrlKey

KeyValue:17

第二次KeyDown裡的KeyEventArgs的值如下:

KeyCode:Keys.A

KeyData:Keys.ContrlKey + Keys.A

KeyValue:65

第一次KeyUp裡的KeyEventArgs的值如下:

KeyCode:Keys.A

KeyData:Keys.ContrlKey + Keys.A

KeyValue:65

第二次KeyUp裡的KeyEventArgs的值如下:

KeyCode:Keys.ContrlKey

KeyData:Keys.ContrlKey

KeyValue:17

可以看出,KeyUp的順序和KeyDown順序是相反的,類似於棧,先進後出。