【问题标题】:Map NSEvent keyCode to virtual key code将 NSEvent keyCode 映射到虚拟键码
【发布时间】:2013-08-23 17:29:50
【问题描述】:

NSEvent keyCode 给出键盘扫描码,它是代表物理键的硬件特定代码。我想将扫描码转换为虚拟键码,它是基于用户键盘布局(QWERTY、AZERTY 等)的逻辑键。

在 Windows 中,我可以通过 MapVirtualKey 执行此操作。什么是 OS X 等价物?

【问题讨论】:

  • 对于遇到类似问题的人。看看KeyNaming library。

标签: macos nsevent


【解决方案1】:

虚拟键代码正是基于用户的键盘布局。它指示按下了哪个键,而不是该键将产生什么字符或如何标记。

例如,kVK_ANSI_A(来自 Carbon/HIToolbox/Events.h,值 0x00)确实 不是 表示产生“A”字符的键,它表示的键是在“A”键在 ANSI 标准键盘中的位置。如果法语键盘布局处于活动状态,则该键将产生“Q”。如果物理键盘是法语键盘,则该键也可能标记为“Q”。

因此,虚拟键码有点类似于扫描码,但来自理想化的标准键盘。如前所述,它与硬件无关。它也独立于键盘布局。

要将虚拟键码转换为字符,您可以使用UCKeyTranslate()。您需要当前键盘布局的“uchr”数据。您可以使用TISCopyCurrentKeyboardLayoutInputSource()TISGetInputSourceProperty()kTISPropertyUnicodeKeyLayoutData 作为属性键。

您还需要键盘类型代码。我相信仍然支持使用LMGetKbdType() 来获得它,即使它不再记录在遗留部分中。如果您不喜欢这样,您可以从NSEvent 获取CGEvent使用CGEventCreateSourceFromEvent() 从中创建CGEventSource,然后使用CGEventSourceGetKeyboardType()并调用@987654344 @ 和 kCGKeyboardEventKeyboardType 获取键盘类型。

当然,简单地使用-[NSEvent characters]-[NSEvent charactersIgnoringModifiers] 要容易得多。或者,如果您正在实现文本视图,请将按键事件发送到-[NSResponder interpretKeyEvents:](如Cocoa Event Handling Guide: Handling Key Events 中所述)或-[NSTextInputContext handleEvent:](如Cocoa Text Architecture Guide:Text Editing 中所述)。如果击键(在最近事件和输入源的上下文中)会产生文本,则其中任何一个都将使用适当的操作选择器(如moveBackward:)或-insertText: 回调视图。

【讨论】:

  • 啊,谢谢您从Mac的角度解释虚拟键码,它似乎与Windows不同。为我的应用关心的字符测试 charactersIgnoringModifiers 似乎最简单。
  • 自从 Carbon Core 和 Carbon 一般被弃用以来,API 调用有哪些?
  • @Julien,并非所有的 Carbon 都已弃用。我这里提到的功能不是。
  • 嗯,有趣。函数本身没有被标记为弃用,而是整个模块,没有在函数文档中提及。
【解决方案2】:

根据 NSEvent 文档,-[NSEvent keyCode] 返回与硬件无关的虚拟键代码。

【讨论】:

  • 嗯,你是对的,出于某种原因,我认为这与硬件有关,我猜是因为这似乎是我的应用程序中的行为。我想我还有更多的调查要做。这里没什么可看的,继续……
猜你喜欢
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
相关资源
最近更新 更多