.net - 解释 SetWindowsHookEx/WH_KEYBOARD_LL 的正确逻辑

标签 .net winapi user32 setwindowshookex wh-keyboard-ll

转换来自 SetWindowsHookEx 的消息的正确方法是什么?与 WH_KEYBOARD_LL转化为按下的键的有用表示?

我知道这很可能涉及理解本地键盘的映射。 (注意:为了简单起见,我只考虑按下按键的时间,而不考虑释放按键的时间)

一般来说,似乎有三种情况:

  • 按下特殊键(Ctrl/Escape/Shift/Alt)
  • 按下标准按键(A-Z0-9 等...请注意 aA两者都读作 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/

相关文章:

.net - 结构 "faster"比类 - 通常还是在 .NET 框架中?

c - 读取键盘状态

winapi - 使用 WS_EX_COMPOSITED 选项卡控制高 CPU 使用率

javascript - Node ffi Rect 类型

.net - 检测程序的运行实例并向其传递信息

c# - 在 System.DirectoryServices.AccountManagement 中调用 UserPrinciapl.GetGroups 时出现奇怪的间歇性错误处理错误

.net - Visual Studio 2008 中的 BaseOutputPath 错误?

winapi - 我需要安装 Windows 10 SDK 的哪一部分才能获取 MakeAppx.exe?

c - C中的延迟()问题