在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()
第二次处理击键。我相信这就是"标记"字符(用橙色显示)是如何确定的,尽管正如我上面所说,该字符不一定与死键状态如何实际影响后续击键有任何特定关系。您还可以处理假按空格键来确定该字符。