获取 NSEvent 中的字符重音

Ibo*_*lit 2 macos cocoa nsevent

在 Cocoa 中,您可以重写keyDown(event:NSEvent)某些类中的方法,以便在用户按下某个键时收到通知。在大多数情况下,事件将包含按键代码和按下的字符等。但是,如果您按美式扩展键盘上的\'",您将得到键控代码,但不会得到符号。当您键入时,例如在文本编辑器中,您将在橙色背景上获得相应的符号,然后,如果您键入一个字母,如果该字母可以用该符号重音,您将获得重音字母,例如\xc3\xb2or\xc3\xb6\xc3\xb3

\n\n

我能以某种方式从活动中获得口音,或者在活动结束后立即在某个地方查找它吗?

\n

Ken*_*ses 6

首先,这样的键被称为“死键”。它们本身不产生字符,而是修改后续击键产生的字符。

\n\n

至于你的问题,死键事件没有单一的口音。死键只会改变内部状态机的状态。在某些键盘布局中,单个死键可以具有多种效果,具体取决于后续键。例如,在爱沙尼亚语键盘布局中,Option-(退格键左侧的键)设置死键状态,将“a”更改为“\xc3\xa4”,“i”更改为“\xc5\xaf” ,“z”到“\xc5\xbc”,“\xc3\xb6”到“\xc5\x91”。

\n\n

无论如何,如果您想手动处理关键事件,您可以使用UCKeyTranslate(). 您需要键盘布局\'uchr\'数据,您可以使用该数据并通过 keyTISCopyCurrentKeyboardLayoutInputSource()调用该数据。TISGetInputSourceProperty()kTISPropertyUnicodeKeyLayoutData

\n\n

您还需要键盘类型,您可以从CGEvent该键盘的NSEvent基础上获取该类型。呼叫CGEvent()NSEvent然后CGEventGetIntegerValueField()用钥匙呼叫该kCGKeyboardEventKeyboardType

\n\n

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

\n\n

您需要跟踪正在运行的死键状态。最初,您将其设置为 0,然后对于每个关键事件您都可以UCKeyTranslate()更新它。当焦点转移到另一个控件或窗口时,您可以将其重置为 0。

\n\n

如果从返回时死键状态非零,UCKeyTranslate()则存在死键。UCKeyTranslate()也可能产生了人物。也就是说,击键既可以产生真实字符,又可以设置死键状态,该状态将修改后续的击键。

\n\n

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

\n