鍵盤輸入的運作方式

Windows Form 會引發回應 Windows 訊息的鍵盤事件,以處理鍵盤輸入。 大部分的 Windows Form 應用程式都是經由處理鍵盤事件來處理鍵盤輸入。 但是,你必須了解鍵盤訊息的運作方式,才能實作更進階的鍵盤輸入案例,例如在按鍵到達控制項之前加以攔截。 本主題描述 Windows Form 所識別的按鍵資料型別,並提供鍵盤訊息的路由方式概觀。 如需鍵盤事件的詳細資訊,請參閱使用鍵盤事件

按鍵的型別

Windows Form 會將鍵盤輸入識別為由位元 Keys 列舉型別所表示的虛擬按鍵碼 (Virtual Key Code)。 透過 Keys 列舉型別,您可以組合一系列的按鍵來產生一個值。 這些值會對應至伴隨 WM_KEYDOWN 和 WM_SYSKEYDOWN Windows 訊息的值。 您可以透過處理 KeyDownKeyUp 事件,偵測大部分按下的實體鍵。 字元鍵是 Keys 列舉型別的子集,並對應至伴隨 WM_CHAR 和 WM_SYSCHAR Windows 訊息的值。 如果按下的按鍵組合會產生一個字元,您可以處理 KeyPress 事件來偵測該字元。 或者,您可以使用由 Visual Basic 程式設計介面所公開的 Keyboard,探索已按下哪些按鍵並傳送這些按鍵。 如需詳細資訊,請參閱存取鍵盤 (Visual Basic)

鍵盤事件的順序

如前面所列,有 3 個會在控制項上發生的鍵盤相關事件。 下列順序顯示一般的事件順序:

  1. 使用者按下 "a" 按鍵,前置處理、分派按鍵,然後發生 KeyDown 事件。

  2. 使用者按住 "a" 按鍵,前置處理、分派按鍵,然後發生 KeyPress 事件。

    這個事件會在使用者按住按鍵時發生多次。

  3. 使用者放開 "a" 按鍵,前置處理、分派按鍵,然後發生 KeyUp 事件。

前置處理按鍵

不像其他訊息,鍵盤訊息會在表單或控制項的 WndProc 方法中進行處理。 但是,在處理鍵盤訊息之前,PreProcessMessage 方法會呼叫一或多個方法,這些方法可以被覆寫以處理特殊的字元鍵和實體鍵。 在控制項處理訊息之前,您可以覆寫這些方法以偵測和篩選某些按鍵。 下表顯示所執行的動作和出現的相關方法 (以方法出現的順序排列)。

KeyDown 事件的前置處理

動作

相關方法

備註

檢查命令鍵,例如快速鍵或功能表捷徑。

ProcessCmdKey

這個方法會在處理一般按鍵之前,先處理命令鍵。 如果這個方法傳回 true,不會分派按鍵訊息,而且不會發生按鍵事件。 如果傳回 false,會呼叫 IsInputKey.

檢查是否為需要前置處理的特殊按鍵,或者為應該引發 KeyDown 事件並分派給控制項的一般字元按鍵。

IsInputKey

如果方法傳回 true,表示控制項為一般字元並引發 KeyDown 事件。 如果傳回 false,會呼叫 ProcessDialogKey

注意事項注意事項
若要確保控制項取得按鍵或組合鍵,您可以處理 PreviewKeyDown 事件,並為您想要的按鍵將 PreviewKeyDownEventArgsIsInputKey 設定為 true。

檢查是否為巡覽鍵 (ESC、TAB、ENTER 或方向鍵)。

ProcessDialogKey

這個方法會處理利用控制項中特殊功能的實體鍵,例如在控制項和其父代之間切換焦點。 如果直接相關的控制項沒有處理按鍵,便會由父控制項呼叫 ProcessDialogKey,以此類推,直到階層架構中的最上層控制項為止。 如果這個方法傳回 true,便會完成前置處理,並且不會產生按鍵事件。 如果傳回 false,則會發生 KeyDown 事件。

KeyPress 事件的前置處理

動作

相關方法

備註

查看按鍵是否為應該由控制項處理的一般字元。

IsInputChar

如果字元為一般字元,這個方法會傳回 true,並引發 KeyPress 事件,而且不會發生進一步的前置處理。 否則會呼叫 ProcessDialogChar

查看字元是否為助憶鍵,例如按鈕上的 [確定(&O)]。

ProcessDialogChar

這個方法類似 ProcessDialogKey,會沿著控制項階層架構向上呼叫。 如果控制項是容器控制項,則會在控制項本身和其子控制項上呼叫 ProcessMnemonic,以檢查助憶鍵。 如果 ProcessDialogChar 傳回 true,不會發生 KeyPress 事件。

處理鍵盤訊息

在鍵盤訊息到達表單或控制項上的 WndProc 方法後,會由可以被覆寫的一組方法進行處理。 這些方法中的每一個都會傳回 Boolean 值,指定鍵盤訊息是否已經由控制項處理和使用。 如果其中一個方法傳回 true,會認為訊息已經處理,並且不會再傳入控制項的基底或父代做進一步的處理。 否則,訊息會停留在訊息佇列中,並且可能會由控制項的基底或父代中的另一個方法處理。 下表顯示會處理鍵盤訊息的方法:

方法

備註

ProcessKeyMessage

這個方法會處理由控制項的 WndProc 方法所收到的所有鍵盤訊息。

ProcessKeyPreview

這個方法會將鍵盤訊息傳送到控制項的父代。 如果 ProcessKeyPreview 傳回 true,便不會產生按鍵事件;否則會呼叫 ProcessKeyEventArgs

ProcessKeyEventArgs

這個方法會適當地引發 KeyDownKeyPressKeyUp 事件。

覆寫鍵盤方法

當鍵盤訊息在處理中和已處理時,有許多可以進行覆寫的方法;但是其中有些方法是較好的選擇。 下表顯示您可能想要完成的工作,以及覆寫鍵盤方法的最佳方式。 如需覆寫方法的詳細資訊,請參閱Overriding Properties and Methods

工作

方法

攔截巡覽鍵並引發 KeyDown 事件。 例如,您想要在文字方塊中處理 TAB 和 Enter 鍵。

覆寫 IsInputKey

注意事項注意事項
或是,您可以處理 PreviewKeyDown 事件,並且針對您想要的按鍵將 PreviewKeyDownEventArgsIsInputKey 設定為 true。

在控制項上執行特殊輸入或巡覽處理。 例如,您想要在清單控制項中使用方向鍵來變更選取的項目。

覆寫 ProcessDialogKey

攔截巡覽鍵並引發 KeyPress 事件。 例如,在微調方塊控制項中,您想要按下多個方向鍵時可以在項目中加速前進。

覆寫 IsInputChar

KeyPress 事件中執行特殊輸入或巡覽處理。 例如,在清單控制項中,按住 "r" 按鍵時可以跳過其他項目並到達以 r 字母開頭的項目。

覆寫 ProcessDialogChar

執行自訂的助憶鍵處理;例如,您想要在工具列所包含的主控描繪 (Owner-Drawn) 按鈕上處理助憶鍵。

覆寫 ProcessMnemonic

請參閱

參考

Keys

WndProc

PreProcessMessage

概念

存取鍵盤 (Visual Basic)

使用鍵盤事件

其他資源

My.Computer.Keyboard Object