转换来自 SetWindowsHookEx
的消息的正确方法是什么?与 WH_KEYBOARD_LL
转化为按下的键的有用表示?
我知道这很可能涉及理解本地键盘的映射。 (注意:为了简单起见,我只考虑按下按键的时间,而不考虑释放按键的时间)
一般来说,似乎有三种情况:
- 按下特殊键(Ctrl/Escape/Shift/Alt)
- 按下标准按键(
A-Z
、0-9
等...请注意a
和A
两者都读作A
) - 一些难以定义的情况,例如数字键盘和 F1-F12
可以根据需要处理特殊键,并且在System.Windows.Forms.Keys
中有一些有用的查找。
但如果我(在英式英语键盘上)输入感叹号,它会被检测为 Shift-Down1Shift up
由于我的 Hook 级别太低(我相信),无法在代码通过键盘“转换”层后获取代码,所以我很好奇如何正确解释它们。
至于我为什么要这样做。它最初是为了为我编写的媒体播放器提供方便的快捷方式,该播放器可以在任何地方工作,甚至在游戏中(有些游戏似乎会拦截击键并阻止它们传播到操作系统)。实际上,只要我使用该应用程序(仅可能的用户),我已经得到了足够的东西,但我的好奇心被激起了,如果我愿意的话,我可以如何进一步做到这一点。
最佳答案
根据语言(及其死键的使用),这可能非常复杂。 ToAsciiEx
适用于简单的情况,但如果涉及死键或 IME,事情很快就会变得非常复杂。
Michael Kaplan's blog有一系列有关键盘布局和 Keyboard Layout Creator 的广泛文章,这是一个用于创建键盘布局的工具(将键映射到字符的最简单方法)。当一组击键映射到单个字符时,将使用键盘布局创建器。在这些情况下,可以完成映射,但当需要多个键来确定一个字符时,映射就变得有些棘手。
日语、中文或韩语等语言没有从击键到字符的单一映射。对于这些语言,需要输入法编辑器;这些通常使用 Text Services Framework ,这是一组广泛的 API,输入法编辑器(以及其他文本服务,例如手写识别和语音识别)使用它们与应用程序进行通信,以确定从击键到字符的映射。由于从击键到 IME 字符的映射是由代码定义的,因此低级键盘 Hook 通常根本无法执行此映射。
关于.net - 解释 SetWindowsHookEx/WH_KEYBOARD_LL 的正确逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17901828/