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]
。或者,如果您正在实现 TextView ,请将按键事件发送到 -[NSResponder interpretKeyEvents:]
(如 Cocoa Event Handling Guide: Handling Key Events 中所述)或 -[NSTextInputContext handleEvent:]
(如 Cocoa Text Architecture Guide:Text Editing 中所述)。其中任何一个都将使用适当的操作选择器回调 View ,例如 moveBackward:
,或者使用 -insertText:
如果击键(在最近事件和输入的上下文中)源)将生成文本。
关于macos - 将 NSEvent keyCode 映射到虚拟键码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18408565/