在Cocoa中,您可以覆盖某些类中的keyDown(event:NSEvent)
方法,以便在用户按下某个键时收到通知。在大多数情况下,事件将包含密钥代码和按下的字符等。但是,如果您按美国扩展键盘上的'
或"
,您将获得密钥代码,但不会获得符号。当您键入时,例如在文本编辑器中,您将在橙色背景上获得相应的符号,然后,如果您键入一个字母,如果该字母可以被该符号重音,您将获得重音字母,如{{ 1}}或ò
或ö
。
我可以以某种方式从事件中获得重音,或者在事件发生后立即查看吗?
答案 0 :(得分:3)
首先,这样的键称为“死键”。它们不会自己生成字符,它们会修改后续按键产生的字符。
至于你的问题,死锁事件没有一个重点。死键只是改变内部状态机的状态。在某些键盘布局中,单个死键可以具有各种效果,具体取决于后续键。例如,使用爱沙尼亚语键盘布局,Option-(退格键左侧的键)设置死键状态,将“a”更改为“ä”,“i”更改为“ů”,“z”更改为“ ż“和”ö“到”ő“。
无论如何,如果您想手动处理关键事件,可以使用UCKeyTranslate()
。您需要键盘布局'uchr'
数据,您可以使用TISCopyCurrentKeyboardLayoutInputSource()
获取数据,并使用键TISGetInputSourceProperty()
调用kTISPropertyUnicodeKeyLayoutData
。
您还需要键盘类型,您可以从CGEvent
所基于的NSEvent
获取该键盘类型。致电CGEvent()
上的NSEvent
,然后使用密钥CGEventGetIntegerValueField()
致电kCGKeyboardEventKeyboardType
。
您还必须将事件中修饰键的Cocoa值转换为碳值(shiftKey
,cmdKey
的组合等)右移8位。
您需要跟踪正在运行的死锁状态。最初,您将其设置为0,然后对于您允许UCKeyTranslate()
更新它的每个关键事件。当焦点转移到另一个控件或窗口时,您将其重置为0.
如果从UCKeyTranslate()
返回时死键状态为非零,则表示存在死键。 UCKeyTranslate()
也可能产生了字符。也就是说,键击可以产生真实字符并设置死键状态,这将修改后续击键。
如果您想呈现一个代表死锁状态的字符,您将通过UCKeyTranslate()
第二次使用死键状态和选项中的kUCKeyTranslateNoDeadKeysMask
处理击键。我相信这是“标记”字符(以橙色显示)是如何确定的,尽管如上所述,该字符与死键状态实际上如何影响后续击键并不一定有任何特定的关系。您还可以处理虚假按下Space键以确定此字符。