macos - 将 NSEvent keyCode 映射到虚拟键码

标签 macos nsevent

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/

相关文章:

macos - OSX 上的 Vagrant LoadError

objective-c - NSOutlineView,setFloatsGroupRows : not working

ios - Xcode会为Mac编译,即使它不在Swift.package的platform字段中

cocoa - 单击 NSControl 时不会调用 mouseDown 事件,即使在子类 NSView 上也不会调用

objective-c - 在 NSView Controller 中获取按键按下事件

macOS 应用程序 : handling key combinations bound to global keyboard shortcuts

java - Java 编译器与 Linux/Windows 上的编译器相同吗?

macos - Hadoop Namenode格式在Mac上失败

cocoa - 复制热键上的当前选择

objective-c - 如何在我从该控件之一的子类中放置控件的 View 中使用方法