查看源码 wxKeyEvent (wx v2.4.3)
这个事件类包含关于按键和释放事件的信息。
此事件携带的主要信息是正在按下或释放的键。可以使用 getKeyCode/1
函数或 getUnicodeKey/1
函数访问。对于可打印字符,应使用后者,因为它适用于任何键,包括在使用国家键盘布局时可以输入的非 Latin-1 字符。getKeyCode/1
应该用于处理特殊字符(如光标箭头键或 HOME
或 INS
等),这些字符对应于 WXK_START
常量之上的 ?wxKeyCode 枚举元素。虽然 getKeyCode/1
为了兼容性也返回 Latin-1 键的字符代码,但它不适用于一般的 Unicode 字符,并且对于任何非 Latin-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 字母,而不仅仅是通常的 Latin-1 字母。但是,对于非 Latin-1 字母,只能使用 getUnicodeKey/1
来检索键代码,因为在这种情况下,getKeyCode/1
只返回 WXK_NONE
。
总结一下:如果需要转换后的键,应该处理 wxEVT_CHAR
,如果只需要键本身的值,而与当前键盘状态无关,则应该处理 wxEVT_KEY_DOWN
。
注意:并非所有按键事件都可能由用户生成。例如,使用标准美国键盘布局可以生成键代码为 =
的 wxEVT_KEY_DOWN
,但不能使用德语键盘布局生成,因为在德语键盘布局中,=
键对应于 Shift-0 键组合,其键代码为 0
,而不是 =
。因此,应避免要求用户键入在其键盘上可能无法输入的按键事件。
按键事件和字符事件之间的另一个区别是,当按下 Control 键时,会对后者进行另一种转换:在这种情况下,ASCII 字母的字符事件携带与 Ctrl-Latter 的 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 键本身的 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。
此函数不区分左右 Control 键。
请注意,通常应该使用 getModifiers/1
来代替此函数。
-spec getKeyCode(This) -> integer() when This :: wxKeyEvent().
返回生成此事件的键的键代码。
ASCII 符号返回正常的 ASCII 值,而来自特殊键(如“左光标箭头”(WXK_LEFT
))的事件返回 ASCII 范围之外的值。有关虚拟键代码的完整列表,请参阅 ?wxKeyCode。
请注意,此方法仅对特殊的非字母数字键或用户输入拉丁字母-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。
检查是否按下了 Control、Alt 或仅在 macOS 下的 Command 键(请注意,在 OS X 下也会考虑真正的 Control 键)。
由于兼容性原因,此方法在仅按下 Shift 键时返回 false,并且因为按下 Shift 通常不会更改按键事件的解释,请参阅 HasAnyModifiers()
(未在 wx 中实现),如果您还想考虑 Shift。
-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
来代替此函数。