【发布时间】:2013-01-02 19:20:57
【问题描述】:
我正在寻找一种方法来拦截外部进程中对 WM_CHAR 的 GetMessage() 调用(具体来说,只有活动窗口)。我对使用 SetWindowsHookEx() 犹豫不决 - 我想绝对确保可能修改键盘输入的最广泛的程序有机会首先触发。有人有什么建议吗?
上下文:我正在构建一个应用程序,旨在生成当前键盘布局的视觉效果。但是,我希望使其与第三方键盘重新映射软件尽可能兼容(包括用户制作的 AutoHotkey 脚本等)。当通过热键触发时,我的程序将按键发送到活动窗口(扫描码 + 适当的虚拟键),它应该由其窗口过程处理......从而触发任何基于系统范围挂钩的重映射软件和具有被编程为仅重新映射活动应用程序中的键......然后我的程序将拦截生成的 WM_CHAR / WM_UNICHAR / WM_DEADCHAR 消息,从中重建键盘布局。实际上,字符消息不应该到达输出的活动窗口。 (为了兼容性,我可能会用不带字符的消息替换它们。)
PS 抱歉,这可能是一种糟糕的礼仪 - 注册后首先发布问题 - 但我已经研究这个问题很多个晚上了,但我仍然没有找到最佳方案解决方案!我主要使用 AutoHotkey 工作,我完全愿意分享我考虑过的其他方法来获得真正的当前键盘布局,但它们都有其局限性:与重新映射软件玩得很好。
【问题讨论】:
-
我认为我正在寻找类似于 Microsoft Detours 的解决方案。我目前正在尝试使用 DLL 注入和 IPC 概念的轻量级DetoursXS v2,但我没有真正的 C++ 经验,因此进展缓慢。一旦我有具体的东西,我会再次更新!任何关于:绕行消息循环的建议都是最受欢迎的!
标签: hook code-injection autohotkey keyboard-layout getmessage