NSEvent keyCode给出了一个键盘扫描码,这是一个代表物理键的硬件特定代码。我想将扫描码转换为虚拟键码,这是基于用户键盘布局(QWERTY、AZERTY 等)的逻辑键。
在 Windows 中,我可以通过MapVirtualKey做到这一点。什么是 OS X 等价物?
NSEvent keyCode给出了一个键盘扫描码,这是一个代表物理键的硬件特定代码。我想将扫描码转换为虚拟键码,这是基于用户键盘布局(QWERTY、AZERTY 等)的逻辑键。
在 Windows 中,我可以通过MapVirtualKey做到这一点。什么是 OS X 等价物?
虚拟键码恰恰不是基于用户的键盘布局。它指示按下了哪个键,而不是该键将产生什么字符或如何标记。
例如,kVK_ANSI_A
(来自 Carbon/HIToolbox/Events.h, value 0x00
)不是指产生“A”字符的键,而是指在 ANSI 标准键盘中的“A”键所在位置的键。如果法语键盘布局处于活动状态,则该键将产生“Q”。如果物理键盘是法语键盘,则该键也可能标记为“Q”。
因此,虚拟键码有点类似于扫描码,但来自理想化的标准键盘。如前所述,它与硬件无关。它也独立于键盘布局。
要将虚拟键码转换为字符,您可以使用UCKeyTranslate()
. 您需要当前键盘布局的“uchr”数据。您可以使用TISCopyCurrentKeyboardLayoutInputSource()
然后TISGetInputSourceProperty()
使用kTISPropertyUnicodeKeyLayoutData
作为属性键来获取它。
您还需要键盘类型代码。我相信仍然支持使用它LMGetKbdType()
来获得它,即使它不再记录在遗留部分中。如果你不喜欢这样,你可以从 中获取 a CGEvent
,NSEvent
使用从中创建一个,然后使用并调用CGEventSource
CGEventCreateSourceFromEvent()
CGEventSourceGetKeyboardType()
CGEventGetIntegerValueField()
withkCGKeyboardEventKeyboardType
来获取键盘类型。
当然,简单地使用-[NSEvent characters]
or会容易得多-[NSEvent charactersIgnoringModifiers]
。或者,如果您正在实现一个文本视图,则将按键事件发送到-[NSResponder interpretKeyEvents:]
(如Cocoa 事件处理指南:处理键事件中所述)或-[NSTextInputContext handleEvent:]
(如Cocoa 文本架构指南:文本编辑中所述)。其中任何一个都将使用适当的操作选择器(如 )回调视图moveBackward:
,或者-insertText:
如果击键(在最近事件和输入源的上下文中)会产生文本。
根据 NSEvent 文档,-[NSEvent keyCode]
返回与硬件无关的虚拟键代码。