NSEvent keyCode提供键盘扫描代码,这是代表物理密钥的硬件特定代码.我想将扫描代码转换为虚拟键代码,这是基于用户键盘布局(QWERTY,AZERTY等)的逻辑键.
在Windows中,我可以通过MapVirtualKey完成此操作.什么是OS X等价物?
Ken*_*ses 18
虚拟键代码正好不是基于用户的键盘布局.它指示按下了哪个键,而不是键会产生什么字符,也不表示它是如何标记的.
例如,kVK_ANSI_A
(从碳/使HIToolbox/Events.h,值0x00
)不不意味着其产生"A"的字符键,这意味着其是,所述"A"键是一个ANSI标准键盘的位置的键.如果法语键盘布局处于活动状态,则该键将生成"Q".如果物理键盘是法语键盘,那么该键也可能标记为"Q".
因此,虚拟键代码类似于扫描代码,但来自理想化的标准键盘.如上所述,它与硬件无关.它也独立于键盘布局.
要从虚拟键代码转换为字符,您可以使用UCKeyTranslate()
.您需要当前键盘布局的'uchr'数据.您可以使用TISCopyCurrentKeyboardLayoutInputSource()
,然后TISGetInputSourceProperty()
使用kTISPropertyUnicodeKeyLayoutData
属性键.
您还需要键盘类型代码.我相信它仍然支持使用LMGetKbdType()
它,即使它已经不再记录,除了遗留部分.如果你不喜欢,你可以得到一个CGEvent
从NSEvent
,创建一个,并呼吁CGEventSource
从使用CGEventCreateSourceFromEvent()
,再利用CGEventSourceGetKeyboardType()
CGEventGetIntegerValueField()
与kCGKeyboardEventKeyboardType
获得键盘类型.
当然,简单地使用-[NSEvent characters]
或更容易-[NSEvent charactersIgnoringModifiers]
.或者,如果您正在实现文本视图,请将关键事件发送到-[NSResponder interpretKeyEvents:]
(如" 可可事件处理指南:处理关键事件"中所述)或-[NSTextInputContext handleEvent:]
(如" 可可文本体系结构指南:文本编辑"中所述).这些中的任何一个都将使用适当的操作选择器回调视图moveBackward:
,或者-insertText:
如果击键(在最近事件和输入源的上下文中)将产生文本.
归档时间: |
|
查看次数: |
5414 次 |
最近记录: |