将NSEvent keyCode映射到虚拟键代码

时间:2013-08-23 17:29:50

标签: macos nsevent

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

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

2 个答案:

答案 0 :(得分:18)

根据用户的键盘布局,虚拟键码正好。它表示按下了哪个键,而不是键所产生的字符以及标记的键。

例如,kVK_ANSI_A(来自Carbon / HIToolbox / Events.h,值0x00表示产生'A'字符的键,这意味着位于“A”键位于ANSI标准键盘中的键。如果法语键盘布局处于活动状态,则该键将生成“Q”。如果物理键盘是法语键盘,那么该键也可能标记为“Q”。

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

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

您还需要键盘类型代码。我相信它仍然支持使用LMGetKbdType()来获得它,即使它已经不再记录,除了遗留部分。如果您不喜欢,可以从CGEvent获取NSEvent使用CGEventCreateSourceFromEvent()CGEventSource创建CGEventGetIntegerValueField(),然后使用{{3} 并使用kCGKeyboardEventKeyboardType调用moveBackward:以获取键盘类型。

当然,简单地使用CGEventSourceGetKeyboardType()-[NSEvent characters]会更容易。或者,如果您要实施文字视图,请将关键事件发送至-[NSEvent charactersIgnoringModifiers](如-[NSResponder interpretKeyEvents:]中所述)或Cocoa Event Handling Guide: Handling Key Events(如-[NSTextInputContext handleEvent:]中所述)。如果键击(在最近事件和输入源的上下文中)将生成文本,则其中任何一个都将使用相应的操作选择器(如-insertText:)或{{1}}回调视图。

答案 1 :(得分:1)

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