将NSEvent keyCode映射到虚拟键代码

Nat*_*teS 7 macos nsevent

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

在Windows中,我可以通过MapVirtualKey完成此操作.什么是OS X等价物?

Ken*_*ses 18

虚拟键代码正好不是基于用户的键盘布局.它指示按下了哪个键,而不是键会产生什么字符,也不表示它是如何标记的.

例如,kVK_ANSI_A(从碳/使HIToolbox/Events.h,值0x00)不意味着其产生"A"的字符键,这意味着其是,所述"A"键是一个ANSI标准键盘的位置的键.如果法语键盘布局处于活动状态,则该键将生成"Q".如果物理键盘是法语键盘,那么该键也可能标记为"Q".

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

要从虚拟键代码转换为字符,您可以使用UCKeyTranslate().您需要当前键盘布局的'uchr'数据.您可以使用TISCopyCurrentKeyboardLayoutInputSource(),然后TISGetInputSourceProperty()使用kTISPropertyUnicodeKeyLayoutData属性键.

您还需要键盘类型代码.我相信它仍然支持使用LMGetKbdType()它,即使它已经不再记录,除了遗留部分.如果你不喜欢,你可以得到一个CGEventNSEvent,创建一个CGEventSource从使用CGEventCreateSourceFromEvent(),再利用CGEventSourceGetKeyboardType(),并呼吁CGEventGetIntegerValueField()kCGKeyboardEventKeyboardType获得键盘类型.

当然,简单地使用-[NSEvent characters]或更容易-[NSEvent charactersIgnoringModifiers].或者,如果您正在实现文本视图,请将关键事件发送到-[NSResponder interpretKeyEvents:](如" 可可事件处理指南:处理关键事件"中所述)或-[NSTextInputContext handleEvent:](如" 可可文本体系结构指南:文本编辑"中所述).这些中的任何一个都将使用适当的操作选择器回调视图moveBackward:,或者-insertText:如果击键(在最近事件和输入源的上下文中)将产生文本.