8

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

在 Windows 中,我可以通过MapVirtualKey做到这一点。什么是 OS X 等价物?

4

2 回答 2

21

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

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

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

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

您还需要键盘类型代码。我相信仍然支持使用它LMGetKbdType()来获得它,即使它不再记录在遗留部分中。如果你不喜欢这样,你可以从 中获取 a CGEventNSEvent使用从中创建一个,然后使用CGEventSourceCGEventCreateSourceFromEvent()CGEventSourceGetKeyboardType()并调用CGEventGetIntegerValueField()withkCGKeyboardEventKeyboardType来获取键盘类型。

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

于 2013-08-23T23:50:12.553 回答
1

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

于 2013-08-23T18:12:34.273 回答