窗口未接收WM_KEYDOWN/WM_KEYUP事件

Window Not Receiving WM_KEYDOWN/WM_KEYUP Events

本文关键字:WM KEYUP 事件 KEYDOWN 窗口      更新时间:2023-10-16

我通过SetWindowHookExA(从DLL注入)挂接到另一个进程主窗口,并附加到WH_KEYBOARD事件。但是,我的回调从未被调用,但钩子成功,我确实得到了原始值作为回报。

在使用Spy++进行调查时,该窗口似乎从未收到任何WM_KEYUP/WM_KEYDOWN等消息。使用调试器进一步挖掘,我可以确认窗口消息正在由PeekMessage/TranslateMessage/DispatchMessage处理,因此根据基于PeekMessage的MSDN,事件应该正常发生。然而,它们似乎从未发生过。

是否有某些东西允许创建的窗口阻止这些消息发生在他们的窗口中?(我也尝试通过 SetWindowLongPtr 挂接到 WNDPROC,但仍然没有,我的回调可以正常接收所有消息,但 WM_KEY* 消息从未发生过。

应用程序确实使用 DirectInput,但是在其他以前使用 DirectInput 的项目中,键盘消息仍会正常发生。

快速回顾一下我尝试过的内容,例如:

  • SetWindowsHookExA 与 WH_KEYBOARD; 回调从未调用。
  • 带有GWL_WNDPROC的 SetWindowLongPtr 呼叫被击中,永远不会看到键盘消息。
  • 已确认窗口确实使用速览消息来处理其消息,因此键盘消息应该可以正常工作。

我只是挂接到DirectInput,并通过它创建了我需要的键盘处理内容。这不是我想做的事情,但最终结果根据需要工作。

MSDN表示,您确实可以在消息到达WNDPROC之前对其进行过滤。看看这个页面。您可能必须连接到堆栈中的更高位置,或者只是重新考虑您的方法。