在 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 值(shiftKey
、cmdKey
等的组合) 8 位。
您需要跟踪 运行 死键状态。最初,您将其设置为 0,然后对于每个关键事件,您会让 UCKeyTranslate()
更新它。当焦点转移到另一个控件或 window.
时,您会将其重置为 0
如果从 UCKeyTranslate()
开始 return 上的死键状态为非零,则存在死键。 UCKeyTranslate()
也可能产生了字符。也就是说,一次击键既可以产生真实的字符,也可以设置一个死键状态,该状态将修改后续的击键。
如果你想呈现一个字符来表示死键状态,你可以通过 UCKeyTranslate()
第二次处理击键,在死键状态和选项中 kUCKeyTranslateNoDeadKeysMask
。我相信这就是 "marked" 字符(以橙色显示)的确定方式,尽管正如我上面所说,该字符不一定与死键状态实际影响后续击键的方式有任何特定关系。您还可以假按 Space 键来确定此字符。
在 Cocoa 中,您可以覆盖某些 类 中的 keyDown(event:NSEvent)
方法,以便在用户按下某个键时得到通知。在大多数情况下,事件将包含按键代码和按下的字符等内容。但是,如果您在美式扩展键盘上按 '
或 "
,您将获得键码,而不是符号。当你输入时,比如在文本编辑器中,你会在橙色背景上得到相应的符号,然后,如果你输入一个字母,如果那个字母可以用那个符号重音,你就会得到重音字母,比如 ò
或 ö
或 ó
.
我能否以某种方式从活动中获取口音,或者在活动结束后立即在某处查找?
首先,像这样的键叫做"dead keys"。它们不会自己产生字符,它们会修改后续击键产生的字符。
关于你的问题,死键事件没有单一的重音。死键只会改变内部状态机的状态。在某些键盘布局中,单个死键可以根据后续键产生多种效果。例如,在爱沙尼亚语键盘布局中,Option-(退格键左侧的键)设置死键状态,将 "a" 更改为“ä”,"i" 更改为“ů”,"z" 到“ż”,“ö”到“ő”。
无论如何,如果你想手动处理按键事件,你会使用UCKeyTranslate()
。您需要键盘布局 'uchr'
数据,您可以使用 TISCopyCurrentKeyboardLayoutInputSource()
并使用键 kTISPropertyUnicodeKeyLayoutData
.
TISGetInputSourceProperty()
来获取这些数据
您还需要键盘类型,您可以从 NSEvent
所基于的 CGEvent
中获取。在 NSEvent
上调用 CGEvent()
,然后在 kCGKeyboardEventKeyboardType
.
CGEventGetIntegerValueField()
您还必须将事件中修饰键的 Cocoa 值转换为右移的 Carbon 值(shiftKey
、cmdKey
等的组合) 8 位。
您需要跟踪 运行 死键状态。最初,您将其设置为 0,然后对于每个关键事件,您会让 UCKeyTranslate()
更新它。当焦点转移到另一个控件或 window.
如果从 UCKeyTranslate()
开始 return 上的死键状态为非零,则存在死键。 UCKeyTranslate()
也可能产生了字符。也就是说,一次击键既可以产生真实的字符,也可以设置一个死键状态,该状态将修改后续的击键。
如果你想呈现一个字符来表示死键状态,你可以通过 UCKeyTranslate()
第二次处理击键,在死键状态和选项中 kUCKeyTranslateNoDeadKeysMask
。我相信这就是 "marked" 字符(以橙色显示)的确定方式,尽管正如我上面所说,该字符不一定与死键状态实际影响后续击键的方式有任何特定关系。您还可以假按 Space 键来确定此字符。