Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 窗口未接收WM\U KEYDOWN/WM\U KEYUP事件_C++_Windows_Winapi_Windows Messages - Fatal编程技术网

C++ 窗口未接收WM\U KEYDOWN/WM\U KEYUP事件

C++ 窗口未接收WM\U KEYDOWN/WM\U KEYUP事件,c++,windows,winapi,windows-messages,C++,Windows,Winapi,Windows Messages,我通过SetWindowHookExA(从DLL注入)连接到另一个进程主窗口,并连接到WHU键盘事件。然而,我的回调从未被调用,但是挂钩成功了,我确实得到了原始值作为回报 使用Spy++进行调查后,窗口似乎从未收到任何WM_KEYUP/WM_KEYDOWN等消息。通过调试器进一步挖掘,我可以确认窗口消息正在由PeekMessage/TranslateMessage/DispatchMessage处理,因此根据基于PeekMessage的MSDN,事件应该正常发生。然而,它们似乎从未发生过 是否存

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

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

是否存在允许创建的窗口阻止这些消息在其窗口中发生的情况?(我也尝试过通过SetWindowLongPtr连接WNDPROC,但仍然没有成功,我的回调可以接收所有消息,但WM_KEY*消息从未发生过。)

应用程序确实使用DirectInput,但是在以前使用DirectInput的其他项目中,键盘消息仍然正常出现

只是简单地回顾一下我所做的尝试,例如:

  • 使用WH_键盘设置WindowsHookxa;我从未打过电话
  • 使用GWL_WNDPROC设置WindowLongPTR;呼叫被命中,从未看到键盘消息
  • 确认窗口确实使用PeekMessage来处理它的消息,所以键盘消息应该可以正常发生

MSDN说,您确实可以在邮件到达WNDPROC之前过滤邮件。看一看。您可能需要在堆栈中挂接到更高的位置,或者重新考虑您的方法。

我刚挂接到DirectInput,并通过它创建了所需的键盘处理功能。这不是我想做的事情,但最终结果会按需要工作。

它可能使用原始输入。窗口是否获得输入焦点?是的,焦点会发生。鼠标完全可以正常工作。用WH_鼠标钩住鼠标工作正常,消息按预期处理。窗口可以聚焦等。没有问题。因此,我看不到任何地方的窗口没有正确聚焦以进行输入。其他人安装了全局键盘挂钩,无法调用
CallNextHookEx
。在这种情况下,键盘输入仍然可以到达目标窗口,但是链中的所有其他钩子都没有机会看到它。其他任何钩子都不会安装。我已经准备好了钩子,以防止任何其他钩子在我的钩子之后被应用,甚至没有人试图创建钩子。除了在调用消息时删除消息外,它们几乎使用所有空参数调用PeekMessage。因此,从外观上看,他们根本没有过滤掉结果消息。