将NSEvent密钥代码映射到虚拟密钥代码



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]返回与硬件无关的虚拟密钥代码。

相关内容

  • 没有找到相关文章

最新更新