【发布时间】:2013-08-23 17:29:50
【问题描述】:
NSEvent keyCode 给出键盘扫描码,它是代表物理键的硬件特定代码。我想将扫描码转换为虚拟键码,它是基于用户键盘布局(QWERTY、AZERTY 等)的逻辑键。
在 Windows 中,我可以通过 MapVirtualKey 执行此操作。什么是 OS X 等价物?
【问题讨论】:
-
对于遇到类似问题的人。看看KeyNaming library。
NSEvent keyCode 给出键盘扫描码,它是代表物理键的硬件特定代码。我想将扫描码转换为虚拟键码,它是基于用户键盘布局(QWERTY、AZERTY 等)的逻辑键。
在 Windows 中,我可以通过 MapVirtualKey 执行此操作。什么是 OS X 等价物?
【问题讨论】:
虚拟键代码正是不基于用户的键盘布局。它指示按下了哪个键,而不是该键将产生什么字符或如何标记。
例如,kVK_ANSI_A(来自 Carbon/HIToolbox/Events.h,值 0x00)确实 不是 表示产生“A”字符的键,它表示的键是在“A”键在 ANSI 标准键盘中的位置。如果法语键盘布局处于活动状态,则该键将产生“Q”。如果物理键盘是法语键盘,则该键也可能标记为“Q”。
因此,虚拟键码有点类似于扫描码,但来自理想化的标准键盘。如前所述,它与硬件无关。它也独立于键盘布局。
要将虚拟键码转换为字符,您可以使用UCKeyTranslate()。您需要当前键盘布局的“uchr”数据。您可以使用TISCopyCurrentKeyboardLayoutInputSource() 和TISGetInputSourceProperty() 以kTISPropertyUnicodeKeyLayoutData 作为属性键。
您还需要键盘类型代码。我相信仍然支持使用LMGetKbdType() 来获得它,即使它不再记录在遗留部分中。如果您不喜欢这样,您可以从NSEvent 获取CGEvent,使用并调用@987654344 @ 和 CGEventCreateSourceFromEvent() 从中创建CGEventSource,然后使用CGEventSourceGetKeyboardType()kCGKeyboardEventKeyboardType 获取键盘类型。
当然,简单地使用-[NSEvent characters] 或-[NSEvent charactersIgnoringModifiers] 要容易得多。或者,如果您正在实现文本视图,请将按键事件发送到-[NSResponder interpretKeyEvents:](如Cocoa Event Handling Guide: Handling Key Events 中所述)或-[NSTextInputContext handleEvent:](如Cocoa Text Architecture Guide:Text Editing 中所述)。如果击键(在最近事件和输入源的上下文中)会产生文本,则其中任何一个都将使用适当的操作选择器(如moveBackward:)或-insertText: 回调视图。
【讨论】:
根据 NSEvent 文档,-[NSEvent keyCode] 返回与硬件无关的虚拟键代码。
【讨论】: