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事件不會發生
4.處理鍵盤消息
鍵盤消息在到達窗體或控件的 WndProc 方法之後,它們將由一組可被重寫的方法來處理。其中的每種方法都返回一個 Boolean 值,該值指定控件是否已處理和使用了鍵盤消息。如果其中的某種方法返回 true,則鍵盤消息將被視為已處理,而且它將不傳遞到控件的基控件或父控件進行進一步處理。否則,消息將停留在消息隊列中,而且可能會在控件的基控件或父控件的其他方法中進行處理。用來處理鍵盤消息的方法及說明如表所示。
表 處理鍵盤消息
方法 說明 ProcessKeyMessage 此方法處理由控件的WndProc方法接收的所有鍵盤消息 ProcessKeyPreview 此方法將鍵盤消息發送到控件的父控件。如果ProcessKeyPreview返回true,則將不生成鍵事件;否則將調用ProcessKeyEventArgs ProcessKeyEventArgs 此方法根據需要引發KeyDown、KeyPress和KeyUp事件
5.重寫鍵盤方法
在預處理和處理鍵盤消息時,可以使用許多方法進行重寫。需要完成的任務以及重寫鍵盤方法的最佳方式如表所示。
表 重寫鍵盤方法
重寫方法 說明 重寫IsInputKey 截獲導航鍵並引發KeyDown事件。例如,在文本框中處理Tab和回車鍵 重寫ProcessDialogKey 在控件上執行特殊的輸入或導航處理。例如,在列表控件中使用箭頭鍵更改選定項 重寫IsInputChar 截獲導航鍵並引發KeyPress事件。例如,在數字顯示框控件中,多次按箭頭鍵來加快數值的設定速度 重寫ProcessDialogChar 在KeyPress事件期間執行特殊的輸入或導航處理。例如,在列表控件中,按住“r”鍵將跳到以字母r開頭的項並在這些項間切換