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