使用鍵盤的概觀 (Windows Forms .NET)

在 Windows Forms 中,使用者輸入會以 Windows 訊息的形式傳送至應用程式。 一系列的可覆寫方法會在應用程式、表單和控制層級處理這些訊息。 當這些方法接收鍵盤訊息時,它們會引發事件,以取得鍵盤輸入的相關信息。 在許多情況下,Windows Forms 應用程式只要處理這些事件,就能處理所有用戶輸入。 在其他情況下,應用程式可能需要覆寫處理訊息的其中一種方法,才能在應用程式、表單或控件收到訊息之前攔截特定訊息。

重要

.NET 7 和 .NET 6 的桌面指南檔正在建置中。

鍵盤事件

所有 Windows Forms 控制件都會繼承一組與滑鼠和鍵盤輸入相關的事件。 例如,控件可以處理 KeyPress 事件,以判斷按下按鍵的字元碼。 如需詳細資訊,請參閱 使用鍵盤事件

處理使用者輸入訊息的方法

表單和控件可以存取 IMessageFilter 介面和一組可覆寫的方法,以處理消息佇列中不同點的 Windows 訊息。 這些方法都有參數 Message ,其會封裝 Windows 訊息的低階詳細數據。 您可以實作或覆寫這些方法來檢查訊息,然後取用訊息,或將它傳遞給消息佇列中的下一個取用者。 下表顯示處理 Windows Forms 中所有 Windows 訊息的方法。

方法 注意
PreFilterMessage 這個方法會攔截應用層級的已排入佇列(也稱為已張貼)Windows 訊息。
PreProcessMessage 此方法會在處理表單和控件層級之前攔截 Windows 訊息。
WndProc 此方法會處理表單和控件層級的 Windows 訊息。
DefWndProc 這個方法會在表單和控制層級執行 Windows 訊息的預設處理。 這會提供視窗的最低功能。
OnNotifyMessage 這個方法會在處理表單和控件層級之後攔截訊息。 EnableNotifyMessage必須設定樣式位,才能呼叫這個方法。

鍵盤和滑鼠訊息也會由一組額外的可覆寫方法處理,這些方法是那些訊息類型特有的。 如需詳細資訊,請參閱 前置處理索引鍵 一節。 .

金鑰的類型

Windows Forms 會將鍵盤輸入識別為位 Keys 列舉所代表的虛擬按鍵代碼。 Keys透過 列舉,您可以結合一系列按下的按鍵,以產生單一值。 這些值會對應到隨附WM_KEYDOWNWM_SYSKEYDOWN Windows 訊息的值。 您可以藉由處理 KeyDownKeyUp 事件來偵測大部分的實體按鍵按下。 字元索引鍵是列舉的Keys子集,並對應至隨附WM_CHARWM_SYSCHAR Windows 訊息的值。 如果按下的按鍵組合會導致字元,您可以藉由處理 KeyPress 事件來偵測字元。

鍵盤事件的順序

如先前所列,控制項上可能發生有 3 鍵盤相關事件。 下列序列顯示事件的一般順序︰

  1. 使用者推送 「a」 索引鍵、金鑰會預先處理、分派,併 KeyDown 發生事件。
  2. 使用者持有 「a」 索引鍵、金鑰會預先處理、分派,以及 KeyPress 發生事件。 當使用者按住一個按鍵時,此事件會發生很多次。
  3. 用戶釋放 「a」 金鑰,金鑰會預先處理、分派併 KeyUp 發生事件。

前置處理索引鍵

如同其他訊息,鍵盤訊息會在表單或控件的方法中 WndProc 處理。 不過,在處理鍵盤訊息之前,方法會呼叫一或多個方法, PreProcessMessage 這些方法可以覆寫以處理特殊字元鍵和實體按鍵。 您可以覆寫這些方法,以在控制項處理訊息之前,先偵測並篩選特定按鍵。 下表顯示正在執行的動作以及發生的相關方法 (依方法的發生順序顯示)。

KeyDown 事件前置處理

動作 相關方法 備註
檢查命令按鍵,例如快速鍵或功能表捷徑。 ProcessCmdKey 這個方法會處理命令按鍵,其優先於一般按鍵。 如果此方法傳回 true,就不會發送按鍵訊息,也不會發生按鍵事件。 如果傳回 falseIsInputKey 則會呼叫 。.
檢查需要前置處理或一般字元索引鍵的特殊索引鍵,該索引鍵應該引發 KeyDown 事件並分派至控件。 IsInputKey 如果方法傳 true回 ,表示控件是一般字元,而且 KeyDown 會引發事件。 如果 false為 , ProcessDialogKey 則會呼叫 。 注意:若要確保控制項取得索引鍵或按鍵組合,您可以針對您想要的索引鍵或索引鍵處理 PreviewKeyDown 事件的 和 集合PreviewKeyDownEventArgsIsInputKeytrue
檢查導覽鍵 (ESC、TAB、Return 或方向鍵)。 ProcessDialogKey 這個方法會處理運用控制項內特殊功能的實體按鍵,例如在控制項與其父代之間切換焦點。 如果立即控件未處理索引鍵, ProcessDialogKey 則會在父控件上呼叫 ,依此呼叫至階層中最上層的控件。 如果此方法傳回 true,則已完成前置處理,而不會產生按鍵事件。 如果傳回 falseKeyDown 就會發生事件。

KeyPress 事件的前置處理

動作 相關方法 備註
查看按鍵是否為應由控制項處理的標準字元 IsInputChar 如果字元是一般字元,這個方法會 true傳回 , KeyPress 就會引發 事件,而且不會再進行前置處理。 否則 ProcessDialogChar 會呼叫 。
查看此字元是否為助憶鍵 (例如按鈕上 &OK) ProcessDialogChar 這個方法類似於 ProcessDialogKey,將會呼叫控件階層。 如果控件是容器控件,它會藉由呼叫 ProcessMnemonic 本身及其子控件來檢查助記鍵。 如果 ProcessDialogChartrue回 , KeyPress 則不會發生事件。

處理鍵盤訊息

鍵盤訊息到達 WndProc 表單或控件的方法之後,會由一組可覆寫的方法進行處理。 每個方法都會傳回值 Boolean ,指定控件是否已處理和取用鍵盤訊息。 如果其中一個方法傳回 true,則會將訊息視為已處理,而不會傳遞給控制項的基底或父代做進一步處理。 否則,訊息會留在訊息佇列中,而且可能會由控制項的基底或父代中的另一個方法所處理。 下表顯示處理鍵盤訊息的方法。

方法 注意
ProcessKeyMessage 這個方法會處理控件方法所 WndProc 接收的所有鍵盤訊息。
ProcessKeyPreview 此方法會將鍵盤訊息傳送至控制項的父代。 如果 ProcessKeyPreviewtrue回 ,則不會產生任何索引鍵事件,否則 ProcessKeyEventArgs 會呼叫 。
ProcessKeyEventArgs 這個方法會視需要引發 KeyDownKeyPressKeyUp 事件。

覆寫鍵盤方法

若已前置處理及處理鍵盤訊息,有許多方法可用於覆寫;不過,有些方法是更好的選擇 (相較於其他方法)。 下表顯示您可能想要完成的工作,以及覆寫鍵盤方法的最佳方式。 如需覆寫方法的詳細資訊,請參閱 繼承 (C# 程式設計手冊)繼承 (Visual Basic)

Task 方法
攔截流覽鍵並引發 KeyDown 事件。 例如,您希望在文字方塊中處理 TAB 和 Return 鍵。 覆寫 IsInputKey注意:或者,您可以針對您想要的PreviewKeyDownEventArgstrue索引鍵或索引鍵,處理 PreviewKeyDown 事件和 的集合IsInputKey
在控制項上執行特殊輸入或導覽處理。 例如,您想使用清單控制項中的方向鍵來變更所選的項目。 覆寫 ProcessDialogKey
攔截流覽鍵並引發 KeyPress 事件。 例如,在微調方塊控制項中,您想要多次按方向鍵以加快項目的進度。 覆寫 IsInputChar
在事件期間 KeyPress 執行特殊輸入或瀏覽處理。 例如,在清單控制項中按住 "r" 按鍵,可略過以字母 r 開頭的項目。 覆寫 ProcessDialogChar
執行自訂助憶鍵處理;例如,您想要處理工具列內含主控描繪按鈕上的助憶鍵。 覆寫 ProcessMnemonic

另請參閱