Windows窗體通過(guò)引發(fā)鍵盤事件來(lái)處理鍵盤輸入以響應(yīng)Windows消息,大多數(shù)Windows窗體應(yīng)用程序都通過(guò)處理鍵盤事件來(lái)以獨(dú)占方式處理鍵盤輸入。 1.按鍵的類型 Windows窗體將鍵盤輸入標(biāo)識(shí)為由按位Keys枚舉表示的虛擬鍵代碼。使用Keys枚舉,可以綜合一系列按鍵以生成單個(gè)值,這些值與WM_KEYDOWN和WM_SYSKEYDOWNWindows消息所伴隨的值相對(duì)應(yīng)。另外,程序開(kāi)發(fā)人員可通過(guò)處理KeyDown或KeyUp 事件來(lái)檢測(cè)大多數(shù)物理按鍵操作。字符鍵是Keys枚舉的子集,它們與WM_CHAR和WM_SYSCHAR Windows消息所伴隨的值相對(duì)應(yīng),如果通過(guò)組合按鍵得到一個(gè)字符,則可以通過(guò)處理KeyPress事件來(lái)檢測(cè)該字符。 2.鍵盤事件的順序 一個(gè)控件上可能出現(xiàn)3個(gè)與鍵盤相關(guān)的事件,下面是這些事件發(fā)生的常規(guī)順序:
3.鍵的預(yù)處理 像其他消息一樣,鍵盤消息是在窗體或控件的WndProc方法中處理的。窗體或控件在處理鍵盤消息之前,PreProcessMessage方法會(huì)調(diào)用一個(gè)或多個(gè)方法,這些方法可被重寫以處理特殊的字符鍵和物理按鍵。 /*********************/
5. 系統(tǒng)組合鍵的判定 在使用鍵盤的時(shí)候,通常會(huì)使用到CTRL+SHIFT+ALT 類似的組合鍵功能。對(duì)于此,我們?nèi)绾蝸?lái)判定? 通過(guò)KeyUp 事件能夠來(lái)處理(這里說(shuō)明一下為什么不用KeyDown,因?yàn)樵谂卸↘eyDown的時(shí)候,CTRL、SHIFT和ALT 屬于一直按下?tīng)顟B(tài),然后再加另外一個(gè)鍵是不能準(zhǔn)確捕獲組合鍵,所以使用KeyDown 是不能準(zhǔn)確判斷出的,要通過(guò)KeyUp 事件來(lái)判定 ) 6. 捕獲PrScrn按鍵事件 通過(guò)一種鉤子的方式可以判定PrScrn 按鍵事件,鉤子可以獲取任何鍵盤事件。
/*******************/ 其實(shí)我們按下一個(gè)鍵時(shí),KeyDown和KeyPress是都要發(fā)生的,而且兩個(gè)人看上去沒(méi)有什么區(qū)別。但是其實(shí)兩者還是有實(shí)質(zhì)的區(qū)別的。 例如在一個(gè)多行文本框里面輸入字符,為什么我們沒(méi)有定義一個(gè)鍵盤響應(yīng)事件,但是鍵盤卻響應(yīng)了,把字符輸入到了文本框呢?其實(shí)我覺(jué)得因?yàn)檫@個(gè)事件就是系統(tǒng)默認(rèn)的一個(gè)消息響應(yīng),它就是KeyPress。如果你自己還給KeyPress定義了自己的響應(yīng)的話,那么程序會(huì)先執(zhí)行你定義的程序,然后完成系統(tǒng)要求的顯示字符事件的響應(yīng)過(guò)程,但是如果你在自己定義KeyPress事件如:private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)里面增加語(yǔ)句:e.Handled=true;那么系統(tǒng)要求的顯示字符響應(yīng)過(guò)程就不會(huì)被執(zhí)行,原因就是這個(gè)語(yǔ)句的意思就是這個(gè)消息響應(yīng)已經(jīng)完成。但是如果你在KeyDown,KeyUp里面加這條語(yǔ)句,顯示字符串等消息還是會(huì)發(fā)生,這說(shuō)明系統(tǒng)的顯示字符串和KeyDown,KeyUp是沒(méi)有關(guān)系的,而對(duì)于回車和退格消息響應(yīng)則是由KeyDown控制,增加那條語(yǔ)句則回車換行不會(huì)執(zhí)行,退格響應(yīng)也不會(huì)執(zhí)行。 綜上:要屏蔽鍵盤上的一個(gè)字符的輸入,可以在KeyPress里面進(jìn)行增加語(yǔ)句,而要屏蔽回車和退格則可以在KeyDown里面進(jìn)行增加語(yǔ)句。 if (e.Shift == True) |
|