檢視原始碼 wxKeyEvent (wx v2.4.3)
此事件類別包含按鍵按下和釋放事件的資訊。
此事件的主要資訊是正在按下或釋放的按鍵。可以使用 getKeyCode/1
函式或 getUnicodeKey/1
來存取。對於可列印的字元,應使用後者,因為它適用於任何按鍵,包括在使用國家鍵盤配置時可以輸入的非拉丁-1字元。 getKeyCode/1
應該用於處理特殊字元(例如游標箭頭鍵或 HOME
或 INS
等),它們對應於 WXK_START
常數以上的 ?wxKeyCode 列舉元素。雖然 getKeyCode/1
為了相容性也回傳拉丁-1按鍵的字元碼,但它一般不適用於 Unicode 字元,並且對於任何非拉丁-1字元都會回傳 WXK_NONE
。因此,建議始終使用 getUnicodeKey/1
,只有在 getUnicodeKey/1
回傳 WXK_NONE
時才退回到 getKeyCode/1
,這表示事件對應於不可列印的特殊按鍵。
雖然這兩個函式都可以與 wxEVT_KEY_DOWN
、wxEVT_KEY_UP
和 wxEVT_CHAR
類型的事件一起使用,但對於前兩個事件和最後一個事件,它們回傳的值是不同的。對於後者,回傳的按鍵對應於如果使用者在其中按下按鍵,則會出現在例如文字區域中的字元。因此,其值取決於 Shift 鍵的目前狀態,以及對於字母,則取決於 Caps Lock 修飾鍵的狀態。例如,如果按下 A
鍵且未按住 Shift 鍵,則為此按鍵按下而產生的 wxKeyEvent
的類型為 wxEVT_CHAR
,將回傳(從 getKeyCode/1
或 getUnicodeKey/1
,因為它們的含義對於 ASCII 字元是一致的)鍵碼 97,對應於 a
的 ASCII 值。如果按住 Shift 鍵(或啟用 Caps Lock),則相同的按鍵按下,鍵碼將為 65,即大寫 A
的 ASCII 值。
但是,對於按下和放開的事件,回傳的鍵碼將是 A
,而與修飾鍵的狀態無關,也就是說,它僅取決於所按下的實體按鍵,並且不會使用目前的鍵盤狀態轉換為其邏輯表示法。此類未轉換的鍵碼定義如下
對於字母,它們對應於字母的
upper
大寫值。對於其他字母數字鍵(例如
7
或+
),未轉換的鍵碼對應於按下按鍵且未按 Shift 時所產生的字元。例如,在標準美國鍵盤配置中,鍵盤右上角的=/+
鍵的未轉換鍵碼為 61,這是=
的 ASCII 值。對於其餘的按鍵(即特殊的不可列印按鍵),它與正常的鍵碼相同,因為無論如何都不會使用任何轉換。
請注意,第一個規則適用於所有 Unicode 字母,而不僅僅是常見的拉丁-1字母。但是,對於非拉丁-1字母,只有 getUnicodeKey/1
可以用於檢索鍵碼,因為 getKeyCode/1
在這種情況下只回傳 WXK_NONE
。
總結:如果您需要轉換的按鍵,則應處理 wxEVT_CHAR
;如果您只需要按鍵本身的值,而與目前的鍵盤狀態無關,則應處理 wxEVT_KEY_DOWN
。
注意:並非所有按下事件都是由使用者產生的。例如,使用標準美國鍵盤配置可以產生具有 =
鍵碼的 wxEVT_KEY_DOWN
,但使用德文鍵盤配置則無法產生,因為在此配置中,=
鍵對應於 Shift-0 鍵組合,而它的鍵碼是 0
,而不是 =
。因此,您應避免要求使用者輸入可能無法在其鍵盤上輸入的按鍵事件。
按鍵和字元事件之間的另一個區別是,當按下 Control 鍵時,後者會進行另一種轉換:在這種情況下,ASCII 字母的字元事件會攜帶與 Ctrl-字母的 ASCII 值對應的程式碼,即 Ctrl-A 為 1,Ctrl-B 為 2,依此類推,直到 Ctrl-Z 為 26。這對於類似終端的應用程式很方便,並且可以被所有其他應用程式完全忽略(如果您需要處理 Ctrl-A,則最好使用按鍵事件而不是字元事件)。請注意,目前沒有對按下 [、\
、]、^
和 _
鍵進行轉換,它們可能會對應到從 27 到 31 的 ASCII 值。自 2.9.2 版以來,列舉值 WXK_CONTROL_A
WXK_CONTROL_Z
可以用於取代非描述性的常數值 1-26。
最後,修飾鍵只會產生按鍵事件,而不會產生任何字元事件。修飾鍵是 WXK_SHIFT
、WXK_CONTROL
、WXK_ALT
以及來自 ?wxKeyCode 列舉的各種 WXK_WINDOWS_XXX
。
修飾鍵事件在另一個方面是特殊的:通常與按鍵按下相關聯的鍵盤狀態是明確定義的,例如,只有當按下產生此事件本身的按鍵時,Shift 鍵才被按住,shiftDown/1
才會回傳 true
。但是,對於 Shift 鍵本身的按鍵按下事件存在歧義。按照慣例,當按下 Shift 鍵時,它被視為已按下,當釋放時,它被視為已釋放。換句話說,Shift 鍵本身的 wxEVT_KEY_DOWN
事件在 getModifiers/1
中會包含 wxMOD_SHIFT
,而 shiftDown/1
將回傳 true,而 Shift 本身的 wxEVT_KEY_UP
事件的修飾符中不會包含 wxMOD_SHIFT
,並且 shiftDown/1
將回傳 false。
提示:
您可以透過執行 page_samples_keyboard wxWidgets 範例並在其中按下一些按鍵,以互動方式探索系統上所有按鍵產生的鍵碼和修飾符。
注意:如果捕獲到按下 (EVT_KEY_DOWN
) 事件,且事件處理程式未呼叫 event.Skip()
,則對應的字元事件 (EVT_CHAR
) 將不會發生。這是設計好的,可以讓處理這兩種事件類型的程式避免處理同一個按鍵兩次。因此,如果您不想抑制所處理按鍵的 wxEVT_CHAR
事件,請始終在 wxEVT_KEY_DOWN
處理程式中呼叫 event.Skip()
。不這樣做也可能會阻止使用此按鍵定義的加速鍵運作。
注意:如果按鍵保持在按下狀態,您通常會收到很多(自動產生的)按下事件,但只有在最後釋放按鍵時才會收到一個放開事件,因此假設每個按下事件都有一個對應的放開事件是錯誤的。
注意:對於 Windows 程式設計人員:wxWidgets 中的按鍵和字元事件與 Windows WM_KEYDOWN
和 WM_CHAR
事件類似,但略有不同。特別是,Alt-x 組合將在 wxWidgets 中產生字元事件(除非它用作加速鍵),並且幾乎所有按鍵,包括沒有 ASCII 等效項的按鍵,也會產生字元事件。
此類別繼承自並可使用以下函式:
wxWidgets 文件:wxKeyEvent
事件
將 wxEvtHandler:connect/3
與 wxKeyEventType
一起使用,以訂閱此類型的事件。
摘要
函式
如果按下 Alt 鍵,則回傳 true。
如果按下用於命令加速鍵的按鍵,則回傳 true。
如果按下 Control 鍵或 macOS 下的 Apple/Command 鍵,則回傳 true。
回傳產生此事件的按鍵的鍵碼。
回傳所有按下的修飾鍵的位元遮罩。
取得按下按鍵的位置(在用戶端座標中)。
回傳此事件的原始鍵碼。
回傳此事件的低階按鍵旗標。
回傳與此按鍵事件對應的 Unicode 字元。
回傳事件的 X 位置(在用戶端座標中)。
回傳事件的 Y 位置(在用戶端座標中)。
如果按下 Control 或 Alt 鍵,則回傳 true。
如果按下 Meta/Windows/Apple 鍵,則回傳 true。
如果按下 Shift 鍵,則回傳 true。
類型
-type wxKeyEvent() :: wx:wx_object().
-type wxKeyEventType() :: char | char_hook | key_down | key_up.
函式
-spec altDown(This) -> boolean() when This :: wxKeyEvent().
如果按下 Alt 鍵,則回傳 true。
請注意,通常應使用 getModifiers/1
,而不是這個函式。
-spec cmdDown(This) -> boolean() when This :: wxKeyEvent().
如果按下用於命令加速鍵的按鍵,則回傳 true。
與 controlDown/1
相同。已棄用。
請注意,通常應使用 getModifiers/1
,而不是這個函式。
-spec controlDown(This) -> boolean() when This :: wxKeyEvent().
如果按下 Control 鍵或 macOS 下的 Apple/Command 鍵,則回傳 true。
此函式無法區分左右 Ctrl 鍵。
請注意,通常應使用 getModifiers/1
,而不是這個函式。
-spec getKeyCode(This) -> integer() when This :: wxKeyEvent().
回傳產生此事件的按鍵的鍵碼。
ASCII 符號會傳回正常的 ASCII 值,而來自特殊按鍵(例如「左游標箭頭」(WXK_LEFT
))的事件會傳回 ASCII 範圍之外的值。如需虛擬按鍵碼的完整清單,請參閱 ?wxKeyCode。
請注意,此方法僅對特殊的非字母數字按鍵或使用者輸入 Latin-1 字元時,才會傳回有意義的值(這包括 ASCII 以及西歐語言中帶有重音符號的字母,但不包括其他字母,例如斯拉夫字母)。否則,此方法只會傳回 WXK_NONE
,且應使用 getUnicodeKey/1
來取得對應的 Unicode 字元。
如果您對使用者輸入的字元感興趣,通常應使用 getUnicodeKey/1
。 getKeyCode/1
應僅用於特殊按鍵(getUnicodeKey/1
會針對這些按鍵傳回 WXK_NONE
)。要處理這兩種按鍵,您可以撰寫
-spec getModifiers(This) -> integer() when This :: wxKeyEvent().
回傳所有按下的修飾鍵的位元遮罩。
傳回值是 wxMOD_ALT
、wxMOD_CONTROL
、wxMOD_SHIFT
和 wxMOD_META
位元遮罩的組合。此外,wxMOD_NONE
定義為 0,也就是對應於沒有任何修飾符(請參閱 HasAnyModifiers()
(未在 wx 中實作)),而 wxMOD_CMD
要麼是 wxMOD_CONTROL
(MSW 和 Unix),要麼是 wxMOD_META
(Mac),請參閱 cmdDown/1
。如需完整的修飾符清單,請參閱 ?wxKeyModifier。
請注意,此函式比方說 controlDown/1
更容易正確使用,因為在使用後者時,您還必須記得測試是否沒有按下其他任何修飾符。
忘記這樣做可能會導致嚴重的程式錯誤(例如,程式無法在歐洲鍵盤配置上運作,在該配置中,程式將 AltGr
鍵視為 CTRL 和 ALT 的組合)。另一方面,您可以使用此函式簡單地撰寫
使用此函式。
-spec getPosition(This) -> {X :: integer(), Y :: integer()} when This :: wxKeyEvent().
取得按下按鍵的位置(在用戶端座標中)。
請注意,在大多數平台上,此位置只是目前的滑鼠指標位置,與按鍵事件本身沒有特殊關係。
如果不需要相應的座標,x
和 y
可能為 NULL。
-spec getRawKeyCode(This) -> integer() when This :: wxKeyEvent().
回傳此事件的原始鍵碼。
這些旗標是平台相依的,只有在其他 wxKeyEvent
方法提供的功能不足時才應使用。
在 MSW 下,原始按鍵碼是相應訊息的 wParam
參數的值。
在 GTK 下,原始按鍵碼是相應 GDK 事件的 keyval
欄位。
在 macOS 下,原始按鍵碼是相應 NSEvent 的 keyCode
欄位。
注意:目前並非所有埠都支援原始按鍵碼,請使用 #ifdef wxHAS_RAW_KEY_CODES 來判斷此功能是否可用。
-spec getRawKeyFlags(This) -> integer() when This :: wxKeyEvent().
回傳此事件的低階按鍵旗標。
這些旗標是平台相依的,只有在其他 wxKeyEvent
方法提供的功能不足時才應使用。
在 MSW 下,原始旗標只是相應訊息的 lParam
參數的值。
在 GTK 下,原始旗標包含相應 GDK 事件的 hardware_keycode
欄位。
在 macOS 下,原始旗標包含修飾符狀態。
注意:目前並非所有埠都支援原始按鍵旗標,請使用 #ifdef wxHAS_RAW_KEY_CODES 來判斷此功能是否可用。
-spec getUnicodeKey(This) -> integer() when This :: wxKeyEvent().
回傳與此按鍵事件對應的 Unicode 字元。
如果按下的按鍵沒有任何字元值(例如游標鍵),此方法將會傳回 WXK_NONE
。在這種情況下,您應使用 getKeyCode/1
來檢索按鍵的值。
此函式僅在 Unicode 建置中可用,也就是當 wxUSE_UNICODE
為 1 時。
-spec getX(This) -> integer() when This :: wxKeyEvent().
回傳事件的 X 位置(在用戶端座標中)。
請參閱:getPosition/1
-spec getY(This) -> integer() when This :: wxKeyEvent().
回傳事件的 Y 位置(在用戶端座標中)。
請參閱:getPosition/1
-spec hasModifiers(This) -> boolean() when This :: wxKeyEvent().
如果按下 Control 或 Alt 鍵,則回傳 true。
檢查是否按下 Ctrl、Alt 或僅限 macOS 下的 Command 鍵(請注意,在 OS X 下,真實的 Ctrl 鍵仍然會被納入考量)。
如果僅按下 Shift 鍵,此方法會因相容性原因而傳回 false,並且因為按下 Shift 鍵通常不會變更按鍵事件的解釋,如果您也想將 Shift 納入考量,請參閱 HasAnyModifiers()
(未在 wx 中實作)。
-spec metaDown(This) -> boolean() when This :: wxKeyEvent().
如果按下 Meta/Windows/Apple 鍵,則回傳 true。
此函式會測試在 Unix 系統下傳統上稱為 Meta 的按鍵狀態,在 MSW 下則為 Windows 鍵。請注意,通常應使用 getModifiers/1
,而不是這個函式。
請參閱:cmdDown/1
-spec shiftDown(This) -> boolean() when This :: wxKeyEvent().
如果按下 Shift 鍵,則回傳 true。
此函式無法區分左右 Shift 鍵。
請注意,通常應使用 getModifiers/1
,而不是這個函式。