鍵盤輸入的運作方式
Windows Forms 會引發鍵盤事件以回應 Windows 訊息,進而處理鍵盤輸入。 大部分的 Windows Forms 應用程式會藉由處理鍵盤事件來處理鍵盤輸入。 不過,您需要了解鍵盤訊息的運作方式,以便實作更進階的鍵盤輸入案例,例如在按鍵觸達控制項之前先行攔截。 本主題說明 Windows Forms 可辨識的按鍵資料類型,並提供鍵盤訊息的路由方式概觀。 如需鍵盤事件的相關資訊,請參閱使用鍵盤事件。
按鍵類型
Windows Forms 會將鍵盤輸入視為由位元 Keys 列舉代表的虛擬按鍵碼。 使用 Keys 列舉,您可以結合一系列已按下的按鍵來產生單一值。 這些值對應於伴隨 WM_KEYDOWN 和 WM_SYSKEYDOWN Windows 訊息的值。 您可以藉由處理 KeyDown 或 KeyUp 事件來偵測大部分的實體按鍵操作。 字元按鍵是 Keys 列舉的子集,並對應至伴隨 WM_CHAR 和 WM_SYSCHAR Windows 訊息的值。 如果按下的按鍵組合產生了字元,您可以藉由處理 KeyPress 事件來偵測字元。 或者,您可以使用 Keyboard (由 Visual Basic 程式設計介面所公開) 來探索哪些按鍵已按下及傳送按鍵。 如需詳細資訊,請參閱存取鍵盤。
鍵盤事件的順序
如先前所列,控制項上可能發生有 3 鍵盤相關事件。 下列序列顯示事件的一般順序︰
使用者按 "a" 鍵,此鍵會經過前置處理、分派,並發生 KeyDown 事件。
使用者按住 "a" 鍵,此鍵會經過前置處理、分派,並發生 KeyPress 事件。
當使用者按住一個按鍵時,此事件會發生很多次。
使用者放開 "a" 鍵,此鍵會經過前置處理、分派,並發生 KeyUp 事件。
按鍵前置處理
如同其他訊息,鍵盤訊息會在表單或控制項的 WndProc 方法中進行處理。 不過,在處理鍵盤訊息之前,PreProcessMessage 方法會呼叫一或多個可覆寫的方法,以處理特殊字元按鍵與實體按鍵。 您可以覆寫這些方法,以在控制項處理訊息之前,先偵測並篩選特定按鍵。 下表顯示正在執行的動作以及發生的相關方法 (依方法的發生順序顯示)。
KeyDown 事件前置處理
動作 | 相關方法 | 備註 |
---|---|---|
檢查命令按鍵,例如快速鍵或功能表捷徑。 | ProcessCmdKey | 這個方法會處理命令按鍵,其優先於一般按鍵。 如果此方法傳回 true ,就不會發送按鍵訊息,也不會發生按鍵事件。 如果傳回 false ,則會呼叫 IsInputKey. |
檢查需要前置處理的特殊按鍵,或應該引發 KeyDown 事件並分派至控制項的標準字元按鍵。 | IsInputKey | 如果此方法傳回 true ,則表示控制項是一般字元並且引發 KeyDown 事件。 若為 false ,則會呼叫 ProcessDialogKey。 注意:若要確保控制項會取得按鍵或按鍵組合,您可以處理 PreviewKeyDown 事件,並且為您要的一或多個按鍵將 PreviewKeyDownEventArgs 的 IsInputKey 設定為 true 。 |
檢查導覽鍵 (ESC、TAB、Return 或方向鍵)。 | ProcessDialogKey | 這個方法會處理運用控制項內特殊功能的實體按鍵,例如在控制項與其父代之間切換焦點。 如果最接近的控制項未處理按鍵,則會在父控制項上呼叫 ProcessDialogKey,以此類推到階層中的最上層控制項。 如果此方法傳回 true ,則已完成前置處理,而不會產生按鍵事件。 如果傳回 false ,就會發生 KeyDown 事件。 |
KeyPress 事件前置處理
動作 | 相關方法 | 備註 |
---|---|---|
查看按鍵是否為應由控制項處理的標準字元 | IsInputChar | 如果此字元是標準字元,這個方法會傳回 true ,就會引發 KeyPress 事件,而且不會發生任何進一步的前置處理。 否則將會呼叫 ProcessDialogChar。 |
查看此字元是否為助憶鍵 (例如按鈕上 &OK) | ProcessDialogChar | 此方法類似於 ProcessDialogKey,會呼叫控制項階層。 如果控制項是容器控制項,它會藉由對本身與其子控制項呼叫 ProcessMnemonic 來檢查助憶鍵。 如果 ProcessDialogChar 傳回 true ,則不會發生 KeyPress 事件。 |
處理鍵盤訊息
在鍵盤訊息送達表單或控制項的 WndProc 方法之後,便會由一組可覆寫的方法進行處理。 每種方法都會傳回 Boolean 值,以指定控制項是否已處理和取用鍵盤訊息。 如果其中一個方法傳回 true
,則會將訊息視為已處理,而不會傳遞給控制項的基底或父代做進一步處理。 否則,訊息會留在訊息佇列中,而且可能會由控制項的基底或父代中的另一個方法所處理。 下表顯示處理鍵盤訊息的方法。
方法 | 注意 |
---|---|
ProcessKeyMessage | 此方法會處理控制項的 WndProc 方法收到的所有鍵盤訊息。 |
ProcessKeyPreview | 此方法會將鍵盤訊息傳送至控制項的父代。 如果 ProcessKeyPreview 傳回 true ,則不會產生任何索引鍵事件,否則會呼叫 ProcessKeyEventArgs。 |
ProcessKeyEventArgs | 此方法會視需要引發 KeyDown、KeyPress 和 KeyUp 事件。 |
覆寫鍵盤方法
若已前置處理及處理鍵盤訊息,有許多方法可用於覆寫;不過,有些方法是更好的選擇 (相較於其他方法)。 下表顯示您可能想要完成的工作,以及覆寫鍵盤方法的最佳方式。 如需有關如何覆寫方法的詳細資訊,請參閱覆寫衍生類別中的屬性與方法。
Task | 方法 |
---|---|
攔截瀏覽鍵並引發 KeyDown 事件。 例如,您希望在文字方塊中處理 TAB 和 Return 鍵。 | 覆寫 IsInputKey。 注意:或者,您可以處理 PreviewKeyDown 事件,並且針對您想要的一或多個索引鍵將 PreviewKeyDownEventArgs 的 IsInputKey 設定為 true 。 |
在控制項上執行特殊輸入或導覽處理。 例如,您想使用清單控制項中的方向鍵來變更所選的項目。 | 覆寫 ProcessDialogKey |
攔截瀏覽鍵並引發 KeyPress 事件。 例如,在微調方塊控制項中,您想要多次按方向鍵以加快項目的進度。 | 覆寫 IsInputChar。 |
在 KeyPress 事件期間執行特殊輸入或瀏覽處理。 例如,在清單控制項中按住 "r" 按鍵,可略過以字母 r 開頭的項目。 | 覆寫 ProcessDialogChar |
執行自訂助憶鍵處理;例如,您想要處理工具列內含主控描繪按鈕上的助憶鍵。 | 覆寫 ProcessMnemonic。 |