Windows窗體通過引發鍵盤事件來處理鍵盤輸入以響應Windows消息,大多數Windows窗體應用程序都通過處理鍵盤事件來以獨占方式處理鍵盤輸入。為了更好的掌握Windows窗體中鍵盤處理的相關操作,程序開發人員應該了解鍵盤消息的工作方式,以便實現更高級的鍵盤輸入方案(例如,在按鍵到達控件之前截獲它們等)。本節將詳細介紹有關Windows窗體中鍵盤處理操作的相關內容。
1.按鍵的類型
Windows窗體將鍵盤輸入標識為由按位Keys枚舉表示的虛擬鍵代碼。使用Keys枚舉,可以綜合一系列按鍵以生成單個值,這些值與WM_KEYDOWN和WM_SYSKEYDOWNWindows消息所伴隨的值相對應。另外,程序開發人員可通過處理KeyDown或KeyUp事件來檢測大多數物理按鍵操作。字符鍵是Keys枚舉的子集,它們與WM_CHAR和WM_SYSCHAR Windows消息所伴隨的值相對應,如果通過組合按鍵得到一個字符,則可以通過處理KeyPress事件來檢測該字符。
2.鍵盤事件的順序
一個控件上可能出現3個與鍵盤相關的事件,下面是這些事件發生的常規順序:
用戶按“a”鍵,該鍵將被預處理和調度,而且會發生KeyDown事件。
用戶按住“a”鍵,該鍵將被預處理和調度,而且會發生KeyPress事件。
用戶松開“a”鍵,該鍵將被預處理和調度,而且會發生KeyUp事件。
3.鍵的預處理
像其他消息一樣,鍵盤消息是在窗體或控件的WndProc方法中處理的。窗體或控件在處理鍵盤消息之前,PreProcessMessage方法會調用一個或多個方法,這些方法可被重寫以處理特殊的字符鍵和物理按鍵。按照KeyDown事件和KeyPress事件預處理方法出現的順序,列出了正在執行的操作以及所出現的相關方法。
表 KeyDown事件的預處理
具體操作 調用方法 說明 檢查命令鍵(如快捷鍵或菜單快捷鍵) ProcessCmdKey 此方法處理命令鍵,命令鍵的優先級高於常規鍵。如果此方法返回true,則將不調度鍵消息,而且將不發生鍵事件。如果此方法返回false,則將調用IsInputKey 檢查該鍵是否為需要預處理的特殊鍵,或者它是否為應當引發KeyDown事件並且被調度到某個控件的普通字符 IsInputKey 如果此方法返回true,則表示該控件為常規字符,而且將引發KeyDown事件。如果此方法返回false,則將調用ProcessDialogKey。注意:為了確保控件獲取某個鍵或鍵的組合可以處理PreviewKeyDown事件,並針對所需的鍵,應該將PrevIEwKeyDownEventArgs的IsInputKey屬性設置為true 檢查該鍵是否為導航鍵(Esc、Tab、回車鍵或箭頭鍵) ProcessDialogKey 此方法處理在控件內實現特殊功能(如在控件及其父級之間切換焦點)的物理按鍵。如果中間控件不處理該鍵,則將調用父控件的ProcessDialogKey,直至層次結構中的最頂端控件。如果此方法返回true,則將完成預處理,而且將不生成按鍵事件。如果此方法返回false,則將發生KeyDown事件表 KeyPress事件的預處理
具體操作 調用方法 說明 檢查該鍵是否為控件應當處理的普通字符 IsInputChar 如果該字符是普通字符,則此方法返回true,並且將引發KeyPress事件,而且不再進行預處理。否則,將調用ProcessDialogChar 檢查該字符是否為助記符(如按鈕上的“確定(&O)”) ProcessDialogChar 類似於ProcessDialogKey,將沿控件的層次結構向上調用此方法。如果控件是容器控件,此方法將通過調用控件及其子控件的ProcessMnemonic來檢查助記鍵。如果 ProcessDialogChar返回true,則KeyPress事件不會發生