檢視原始碼 wxKeyEvent (wx v2.4.3)

此事件類別包含按鍵按下和釋放事件的資訊。

此事件的主要資訊是正在按下或釋放的按鍵。可以使用 getKeyCode/1 函式或 getUnicodeKey/1 來存取。對於可列印的字元,應使用後者,因為它適用於任何按鍵,包括在使用國家鍵盤配置時可以輸入的非拉丁-1字元。 getKeyCode/1 應該用於處理特殊字元(例如游標箭頭鍵或 HOMEINS 等),它們對應於 WXK_START 常數以上的 ?wxKeyCode 列舉元素。雖然 getKeyCode/1 為了相容性也回傳拉丁-1按鍵的字元碼,但它一般不適用於 Unicode 字元,並且對於任何非拉丁-1字元都會回傳 WXK_NONE。因此,建議始終使用 getUnicodeKey/1,只有在 getUnicodeKey/1 回傳 WXK_NONE 時才退回到 getKeyCode/1,這表示事件對應於不可列印的特殊按鍵。

雖然這兩個函式都可以與 wxEVT_KEY_DOWNwxEVT_KEY_UPwxEVT_CHAR 類型的事件一起使用,但對於前兩個事件和最後一個事件,它們回傳的值是不同的。對於後者,回傳的按鍵對應於如果使用者在其中按下按鍵,則會出現在例如文字區域中的字元。因此,其值取決於 Shift 鍵的目前狀態,以及對於字母,則取決於 Caps Lock 修飾鍵的狀態。例如,如果按下 A 鍵且未按住 Shift 鍵,則為此按鍵按下而產生的 wxKeyEvent 的類型為 wxEVT_CHAR,將回傳(從 getKeyCode/1getUnicodeKey/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_SHIFTWXK_CONTROLWXK_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_KEYDOWNWM_CHAR 事件類似,但略有不同。特別是,Alt-x 組合將在 wxWidgets 中產生字元事件(除非它用作加速鍵),並且幾乎所有按鍵,包括沒有 ASCII 等效項的按鍵,也會產生字元事件。

此類別繼承自並可使用以下函式:

wxWidgets 文件:wxKeyEvent

事件

wxEvtHandler:connect/3wxKeyEventType 一起使用,以訂閱此類型的事件。

摘要

函式

如果按下 Alt 鍵,則回傳 true。

如果按下用於命令加速鍵的按鍵,則回傳 true。

如果按下 Control 鍵或 macOS 下的 Apple/Command 鍵,則回傳 true。

回傳產生此事件的按鍵的鍵碼。

回傳所有按下的修飾鍵的位元遮罩。

取得按下按鍵的位置(在用戶端座標中)。

回傳此事件的原始鍵碼。

回傳此事件的低階按鍵旗標。

回傳與此按鍵事件對應的 Unicode 字元。

回傳事件的 X 位置(在用戶端座標中)。

回傳事件的 Y 位置(在用戶端座標中)。

如果按下 Control 或 Alt 鍵,則回傳 true。

如果按下 Meta/Windows/Apple 鍵,則回傳 true。

如果按下 Shift 鍵,則回傳 true。

類型

-type wxKey() ::
          #wxKey{type :: wxKeyEvent:wxKeyEventType(),
                 x :: integer(),
                 y :: integer(),
                 keyCode :: integer(),
                 controlDown :: boolean(),
                 shiftDown :: boolean(),
                 altDown :: boolean(),
                 metaDown :: boolean(),
                 uniChar :: integer(),
                 rawCode :: integer(),
                 rawFlags :: integer()}.
-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/1getKeyCode/1 應僅用於特殊按鍵(getUnicodeKey/1 會針對這些按鍵傳回 WXK_NONE)。要處理這兩種按鍵,您可以撰寫

-spec getModifiers(This) -> integer() when This :: wxKeyEvent().

回傳所有按下的修飾鍵的位元遮罩。

傳回值是 wxMOD_ALTwxMOD_CONTROLwxMOD_SHIFTwxMOD_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().

取得按下按鍵的位置(在用戶端座標中)。

請注意,在大多數平台上,此位置只是目前的滑鼠指標位置,與按鍵事件本身沒有特殊關係。

如果不需要相應的座標,xy 可能為 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,而不是這個函式。