研究了一下KeyDown,KeyPress 和 KeyUp 的學問。讓我們帶着如下問題來說明:
1.這三個事件的順序是怎么樣的?
2.KeyDown 觸發后,KeyUp是不是一定觸發?
3.三個事件的定義
4.KeyDown、KeyUp 和KeyPress 之間的區別
5.如何區分是否按的是小鍵盤?
6.PrScrn按鍵三個事件能夠捕獲嗎?
7.{菜單鍵}和{開始鍵}KeyPress能夠捕獲嗎?
8.如何捕獲系統的組合鍵?
9.通過什么方式捕獲PrScrn按鍵事件?
(一)鍵事件按下列順序發生:
KeyDown
KeyPress
KeyUp
如一個控件上可能出現3個與鍵盤相關的事件,下面是這些事件發生的常規順序:
- 用戶按“a”鍵,該鍵將被預處理和調度,而且會發生KeyDown事件。
- 用戶按住“a”鍵,該鍵將被預處理和調度,而且會發生KeyPress事件。
- 用戶松開“a”鍵,該鍵將被預處理和調度,而且會發生KeyUp事件。
(二)KeyDown觸發后,不一定觸發KeyUp,當KeyDown 按下后,拖動鼠標,那么將不會觸發KeyUp事件。
(三)定義
KeyDown:在控件有焦點的情況下按下鍵時發生。
KeyPress:在控件有焦點的情況下按下鍵時發生。(下面會說和KeyDown 的區別)
KeyUp:在控件有焦點的情況下釋放鍵時發生。
(四)KeyPress 和KeyDown 、KeyPress之間的區別
1.KeyPress主要用來捕獲數字(注意:包括Shift+數字的符號)、字母(注意:包括大小寫)、小鍵盤等除了F1-12、SHIFT、Alt、Ctrl、Insert、Home、PgUp、Delete、End、PgDn、ScrollLock、Pause、NumLock、{菜單鍵}、{開始鍵}和方向鍵外的ANSI字符
KeyDown 和KeyUp 通常可以捕獲鍵盤除了PrScrn所有按鍵(這里不討論特殊鍵盤的特殊鍵)
2.KeyPress 只能捕獲單個字符
KeyDown 和KeyUp 可以捕獲組合鍵。
3.KeyPress 可以捕獲單個字符的大小寫
4.KeyDown和KeyUp 對於單個字符捕獲的KeyValue 都是一個值,也就是不能判斷單個字符的大小寫。
5.KeyPress 不區分小鍵盤和主鍵盤的數字字符。
KeyDown 和KeyUp 區分小鍵盤和主鍵盤的數字字符。
6.其中PrScrn 按鍵KeyPress、KeyDown和KeyUp 都不能捕獲。
(五)系統組合鍵的判定
1.控制鍵的判定
在使用鍵盤的時候,通常會使用到CTRL+SHIFT+ALT 類似的組合鍵功能。對於此,我們如何來判定?
通過KeyUp 事件能夠來處理(這里說明一下為什么不用KeyDown,因為在判定KeyDown的時候,CTRL、SHIFT和ALT 屬於一直按下狀態,然后再加另外一個鍵是不能准確捕獲組合鍵,所以使用KeyDown 是不能准確判斷出的,要通過KeyUp 事件來判定 )
2.鍵的預處理
像其他消息一樣,鍵盤消息是在窗體或控件的WndProc方法中處理的。窗體或控件在處理鍵盤消息之前,PreProcessMessage方法會調用一個或多個方法,這些方法可被重寫以處理特殊的字符鍵和物理按鍵。
其實我們按下一個鍵時,KeyDown和KeyPress是都要發生的,而且兩個人看上去沒有什么區別。但是其實兩者還是有實質的區別的。
例如在一個多行文本框里面輸入字符,為什么我們沒有定義一個鍵盤響應事件,但是鍵盤卻響應了,把字符輸入到了文本框呢?其實我覺得因為這個事件就是系統默認的一個消息響應,它就是KeyPress。如果你自己還給KeyPress定義了自己的響應的話,那么程序會先執行你定義的程序,然后完成系統要求的顯示字符事件的響應過程,但是如果你在自己定義KeyPress事件如:
private void _TextBox_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled=true;
}
那么系統要求的顯示字符響應過程就不會被執行,原因就是這個語句的意思就是這個消息響應已經完成。但是如果你在KeyDown,KeyUp里面加這條語句,顯示字符串等消息還是會發生,這說明系統的顯示字符串和KeyDown,KeyUp是沒有關系的,而對於回車和退格消息響應則是由KeyDown控制,增加那條語句則回車換行不會執行,退格響應也不會執行。
綜上:要屏蔽鍵盤上的一個字符的輸入,可以在KeyPress里面進行增加語句,而要屏蔽回車和退格則可以在KeyDown里面進行增加語句。
(六)捕獲PrScrn按鍵事件
通過一種鈎子的方式可以判定PrScrn 按鍵事件,鈎子可以獲取任何鍵盤事件。
在鍵盤按下鍵然后釋放的過程中有3個事件發生,分別為KeyDown事件、KeyPress事件和KeyUp事件。 KeyDown和KeyUp事件讓應用程序捕捉用戶在鍵盤上按下的特殊鍵或某些特定鍵甚至組合鍵,只有在想要取得按下鍵或特殊鍵的相關信息時,才用到KeyDown和KeyUp事件。下面對KeyDown和KeyUp事件分別進行介紹。1.KeyDown事件KeyDown事件在首次按下某個鍵時發生。
示例 KeyDown事件的使用
本示例中,判斷用戶是否按下特殊鍵,如果是,則顯示在窗體的標題欄上。
程序主要代碼如下:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
string G_str_Mode = "";
string G_str_text = e.KeyCode + ":" + e.Modifiers + ":" + e.KeyData + ":" + "(" + e.KeyValue + ")";
if (e.Shift == true)
G_str_Mode = "Shift 鍵被按下";
if (e.Control == true)
G_str_Mode = "Ctrl 鍵被按下";
if (e.Alt == true)
G_str_Mode = "Alt 鍵被按下";
this.Text = G_str_text + G_str_Mode;
}
注意:上面的代碼中,KeyDown事件取得了一個KeyEventArgs對象e,並返回相關的按鍵信息,KeyEventArgs參數提供數個屬性值,這些屬性根據鍵盤上被按下的按鍵返回對應值。KeyEventArgs參數的屬性值如表所示。
表 KeyEventArgs屬性值
屬性值 說明
Control 獲取一個值,該值指示是否曾按下Ctrl鍵
KeyCode 獲取KeyDown或KeyUp事件的鍵盤代碼
KeyData 獲取KeyDown或KeyUp事件的鍵數據
KeyData 獲取KeyDown或KeyUp事件的鍵數據
KeyValue 獲取KeyDown或KeyUp事件的鍵盤值
Modifiers 獲取KeyDown或KeyUp事件的修飾符標志。這些標志指示按下的Ctrl、Shift和Alt鍵的組合
Shift 獲取一個值,該值指示是否曾按下Shift鍵
2.Keyup事件
Keyup事件在釋放鍵時發生。
示例 Keyup事件的使用
本示例實現的是,當程序運行的時候,按完鍵盤后,自動設置窗體的大小。
程序主要代碼如下。
private void frmKeyDownUP_KeyUp(object sender, KeyEventArgs e)
{
this.ClientSize = new System.Drawing.Size(800,100);
}
相關鏈接:
http://www.csharpwin.com/csharpspace/8906r2353.shtml
