Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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++ 为什么必须将SetWindowsHookEx与windows消息队列一起使用_C++_Hook_Message Queue - Fatal编程技术网

C++ 为什么必须将SetWindowsHookEx与windows消息队列一起使用

C++ 为什么必须将SetWindowsHookEx与windows消息队列一起使用,c++,hook,message-queue,C++,Hook,Message Queue,我一直在尝试使用钩子,但我不明白为什么钩子必须与消息队列一起使用 hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0); MSG msg; while(GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } UnhookWindowsHookEx(ho

我一直在尝试使用钩子,但我不明白为什么钩子必须与消息队列一起使用

hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
        TranslateMessage(&msg);
        DispatchMessage(&msg);
}
UnhookWindowsHookEx(hook);
为什么像这样的东西不起作用

hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, 0);
cin >> aKey;
UnhookWindowsHookEx(hook);
使用boost线程,屏障也不起作用。为什么钩子和解开钩子之间的等待不能以另一种方式完成

编辑:

当我创建这个示例时,我犯了一个错误,我创建了一个WHU键盘钩子,而不是WHU键盘,我不认为这有什么大区别

此外,循环从不执行,只等待GetMessage函数

循环仅在我发布退出消息PostThreadMessageid,WM_quit,2323,NULL时执行;所以我不明白除了等待之外它还能做什么,是否有一些内部处理

相关的:


Windows钩子钩住Windows消息循环:

WHU键盘挂钩使应用程序能够监视消息流量 对于WM_KEYDOWN和WM_keydup,将由 GetMessage或PeekMessage函数。您可以使用WHU键盘挂钩 监视发送到消息队列的键盘输入

控制台应用程序本身并不发送消息,控制台进程会发送消息。因此,除非进程有一个消息循环,否则它不会工作

见:


低级钩子、键盘钩子和鼠标钩子与其他钩子不同。它们不需要将DLL注入目标进程。相反,Windows在自己的进程内直接调用钩子回调。要使其工作,需要一个消息循环。Windows没有其他机制在主线程上进行回调,只有在调用Get/peek消息以使Windows处于控制状态时,才能进行回调

像WHU键盘这样的全局钩子是非常不同的。它需要一个DLL,回调发生在处理键盘消息的进程中。您需要某种进程间通信来让您自己的程序知道这一点。命名管道是通常的选择。当然,这需要注入的流程泵送一个消息循环。否则它不会得到键盘信息

喜欢低水平的钩子,它们更容易上钩。但一定要加油,否则就不行了。而且要小心超时,如果你没有足够的反应,那么Windows会在没有通知的情况下杀死你的钩子


谢谢你的链接,我浏览了所有的链接,但是除了等待,我仍然不明白GetMessage还有什么作用。在我的例子中,控制台应用程序是在我将退出消息发布到线程时执行它的唯一一次。另外,由于GetMessage等待,这不意味着控制台在我退出消息之前不会输出任何消息吗?请参阅Han的回答-Windows只会在知道线程空闲时调用线程。如果线程在GetMesasge中被阻塞,Windows知道它没有做任何事情。因此,如果我理解正确,Windows只能在Get/peek消息调用中调用我的回调?您理解正确。没有其他方法可以安全地将调用注入线程,它必须是空闲的。这就是消息循环存在的原因。@HansPassant澄清一下,您是否建议对于WHU之类的全局钩子,可以使用名为pipes的键盘将信息传递回我自己的程序,而该程序不需要消息泵?