gpt4 book ai didi

c++ - 为什么必须将 SetWindowsHookEx 与 Windows 消息队列一起使用

转载 作者:IT老高 更新时间:2023-10-28 22:23:49 27 4
gpt4 key购买 nike

我一直在尝试用钩子(Hook)做一些事情,但我不明白为什么钩子(Hook)必须与消息队列一起使用

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 线程,屏障也不起作用。为什么hook和unhook之间的等待不能换一种方式呢?

编辑:

我在创建这个示例时犯了一个错误,我创建了一个 WH_KEYBOARD_LL 钩子(Hook),而不是 WH_KEYBOARD,(我认为这不会有很大的不同)

此外,循环永远不会执行,只会等待 GetMessage 函数。

只有当我发布退出消息时循环才会执行 PostThreadMessage(id, WM_QUIT, 2323, NULL); 所以我不明白它除了等待还有什么作用,是否有一些内部处理?

相关:

C++ SetWindowsHookEx WH_KEYBOARD_LL Correct Setup

How can I set up a CBT hook on a Win32 console window?

最佳答案

低级钩子(Hook) WH_KEYBOARD_LL 和 WH_MOUSE_LL 与所有其他钩子(Hook)不同。它们不需要将 DLL 注入(inject)目标进程。相反,Windows 在您自己的进程中直接调用您的 Hook 回调。为了使它工作,需要一个消息循环。 Windows 没有其他机制可以在您的主线程上进行回调,只有在您调用 Get/PeekMessage() 以使 Windows 处于控制状态时才会发生回调。

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

支持低级钩子(Hook),它们更容易上手。但是做泵,否则它不会工作。并且要注意超时,如果你没有足够的响应,那么 Windows 会在没有通知的情况下杀死你的钩子(Hook)。

Understanding the low-level mouse and keyboard hook (win32)

关于c++ - 为什么必须将 SetWindowsHookEx 与 Windows 消息队列一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7458807/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com