【发布时间】:2015-03-23 15:18:09
【问题描述】:
我通过 SetWindowHookExA(从 DLL 注入)连接到另一个进程主窗口并附加到 WH_KEYBOARD 事件。但是,我的回调从未被调用,但挂钩成功,我得到了原始值作为回报。
在使用 Spy++ 进行调查后,窗口似乎根本没有收到任何 WM_KEYUP / WM_KEYDOWN 等消息。使用调试器进一步挖掘我可以确认窗口消息正在由 PeekMessage / TranslateMessage / DispatchMessage 处理,因此根据基于 PeekMessage 的 MSDN,事件应该正常发生。然而,它们似乎从未发生过。
有什么东西可以让创建的窗口阻止这些消息发生在他们的窗口中吗? (我也尝试通过 SetWindowLongPtr 连接到 WNDPROC,但仍然不行,我的回调可以正常接收所有消息,但 WM_KEY* 消息永远不会发生。)
该应用程序确实使用了 DirectInput,但是在其他使用 DirectInput 的先前项目中,键盘消息仍然正常发生。
简单回顾一下我的尝试等:
- 使用 WH_KEYBOARD 设置 WindowsHookExA;从未调用过回调。
- SetWindowLongPtr 与 GWL_WNDPROC;通话被击中,永远不会看到键盘消息。
- 已确认的窗口确实使用 PeekMessage 来处理其消息,因此键盘消息应该会正常发生。
【问题讨论】:
-
它可能使用原始输入。
-
窗口是否获得输入焦点?
-
是的,焦点发生了。鼠标完全可以正常工作。用 WH_MOUSE 钩住鼠标工作正常,消息按预期处理。窗口可以聚焦等没问题。所以我看不到窗口没有正确聚焦以进行输入的任何地方。
-
别人安装了全局键盘钩子,调用
CallNextHookEx失败。在这种情况下,键盘输入仍然可以到达目标窗口,但链中的所有其他钩子都没有机会看到它。 -
没有安装其他任何钩子。我有钩子来防止在我之后应用任何其他钩子,甚至没有尝试创建。
标签: c++ windows winapi windows-messages