在 NSEvent 中获取字符重音

Get the char accent in NSEvent

在 Cocoa 中,您可以覆盖某些 类 中的 keyDown(event:NSEvent) 方法,以便在用户按下某个键时得到通知。在大多数情况下,事件将包含按键代码和按下的字符等内容。但是,如果您在美式扩展键盘上按 '",您将获得键码,而不是符号。当你输入时,比如在文本编辑器中,你会在橙色背景上得到相应的符号,然后,如果你输入一个字母,如果那个字母可以用那个符号重音,你就会得到重音字母,比如 òöó.

我能否以某种方式从活动中获取口音,或者在活动结束后立即在某处查找?

首先,像这样的键叫做"dead keys"。它们不会自己产生字符,它们会修改后续击键产生的字符。

关于你的问题,死键事件没有单一的重音。死键只会改变内部状态机的状态。在某些键盘布局中,单个死键可以根据后续键产生多种效果。例如,在爱沙尼亚语键盘布局中,Option-(退格键左侧的键)设置死键状态,将 "a" 更改为“ä”,"i" 更改为“ů”,"z" 到“ż”,“ö”到“ő”。

无论如何,如果你想手动处理按键事件,你会使用UCKeyTranslate()。您需要键盘布局 'uchr' 数据,您可以使用 TISCopyCurrentKeyboardLayoutInputSource() 并使用键 kTISPropertyUnicodeKeyLayoutData.

在其上调用 TISGetInputSourceProperty() 来获取这些数据

您还需要键盘类型,您可以从 NSEvent 所基于的 CGEvent 中获取。在 NSEvent 上调用 CGEvent(),然后在 kCGKeyboardEventKeyboardType.

上调用 CGEventGetIntegerValueField()

您还必须将事件中修饰键的 Cocoa 值转换为右移的 Carbon 值(shiftKeycmdKey 等的组合) 8 位。

您需要跟踪 运行 死键状态。最初,您将其设置为 0,然后对于每个关键事件,您会让 UCKeyTranslate() 更新它。当焦点转移到另一个控件或 window.

时,您会将其重置为 0

如果从 UCKeyTranslate() 开始 return 上的死键状态为非零,则存在死键。 UCKeyTranslate() 也可能产生了字符。也就是说,一次击键既可以产生真实的字符,也可以设置一个死键状态,该状态将修改后续的击键。

如果你想呈现一个字符来表示死键状态,你可以通过 UCKeyTranslate() 第二次处理击键,在死键状态和选项中 kUCKeyTranslateNoDeadKeysMask 。我相信这就是 "marked" 字符(以橙色显示)的确定方式,尽管正如我上面所说,该字符不一定与死键状态实际影响后续击键的方式有任何特定关系。您还可以假按 Space 键来确定此字符。