在NSEvent中获取char重音



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

我能以某种方式从事件中获得口音,或者在事件发生后立即在某处查找它吗?

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

关于你的问题,死键事件没有统一的口音。死键只是改变内部状态机的状态。在某些键盘布局中,一个死键可以根据后续键产生各种效果。例如,在爱沙尼亚的键盘布局中,Option-(退格键左边的键)设置了一个死键状态,将"a"变为"ä","i"变为"ov","z"变为"je","ö"变为"ov"。

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

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

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

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

如果从UCKeyTranslate()返回时死键状态非零,则表示存在死键。UCKeyTranslate()也可能产生字符。也就是说,一个按键既可以产生真正的字符,也可以设置一个将修改后续按键的死键状态。

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

相关内容

  • 没有找到相关文章

最新更新