使用鍵盤的概觀 (Windows Forms .NET)
在 Windows Forms 中,使用者輸入會以 Windows 訊息的形式傳送至應用程式。 一系列的可覆寫方法會在應用程式、表單和控制層級處理這些訊息。 當這些方法接收鍵盤訊息時,它們會引發事件,以取得鍵盤輸入的相關信息。 在許多情況下,Windows Forms 應用程式只要處理這些事件,就能處理所有用戶輸入。 在其他情況下,應用程式可能需要覆寫處理訊息的其中一種方法,才能在應用程式、表單或控件收到訊息之前攔截特定訊息。
鍵盤事件
所有 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_KEYDOWN和WM_SYSKEYDOWN Windows 訊息的值。 您可以藉由處理 KeyDown 或 KeyUp 事件來偵測大部分的實體按鍵按下。 字元索引鍵是列舉的Keys子集,並對應至隨附WM_CHAR和WM_SYSCHAR Windows 訊息的值。 如果按下的按鍵組合會導致字元,您可以藉由處理 KeyPress 事件來偵測字元。
鍵盤事件的順序
如先前所列,控制項上可能發生有 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 事件。 |
覆寫鍵盤方法
若已前置處理及處理鍵盤訊息,有許多方法可用於覆寫;不過,有些方法是更好的選擇 (相較於其他方法)。 下表顯示您可能想要完成的工作,以及覆寫鍵盤方法的最佳方式。 如需覆寫方法的詳細資訊,請參閱 繼承 (C# 程式設計手冊) 或 繼承 (Visual Basic)
Task | 方法 |
---|---|
攔截流覽鍵並引發 KeyDown 事件。 例如,您希望在文字方塊中處理 TAB 和 Return 鍵。 | 覆寫 IsInputKey。 注意:或者,您可以針對您想要的PreviewKeyDownEventArgstrue 索引鍵或索引鍵,處理 PreviewKeyDown 事件和 的集合IsInputKey。 |
在控制項上執行特殊輸入或導覽處理。 例如,您想使用清單控制項中的方向鍵來變更所選的項目。 | 覆寫 ProcessDialogKey |
攔截流覽鍵並引發 KeyPress 事件。 例如,在微調方塊控制項中,您想要多次按方向鍵以加快項目的進度。 | 覆寫 IsInputChar。 |
在事件期間 KeyPress 執行特殊輸入或瀏覽處理。 例如,在清單控制項中按住 "r" 按鍵,可略過以字母 r 開頭的項目。 | 覆寫 ProcessDialogChar |
執行自訂助憶鍵處理;例如,您想要處理工具列內含主控描繪按鈕上的助憶鍵。 | 覆寫 ProcessMnemonic。 |
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應