gpt4 book ai didi

c++ - Win32 -- 如何管理我的鼠标钩子(Hook)线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:32 30 4
gpt4 key购买 nike

我已经成功地让我的低级鼠标钩子(Hook)代码开始工作,但是我观察到的一些行为我不太明白。如果我生成一个安装鼠标 Hook 的线程,一切正常。当我不再需要它运行时,我让线程在退出程序时自动销毁,我想我可以轻松地显式终止线程。然而,这让我感到不安,因为我不会最终调用 UnhookWindowsHookEx 来释放鼠标 Hook 资源。

所以我试图在我的测试程序中反转逻辑。我尝试生成一个休眠一段时间的线程,然后写入一个全局变量。然后我从主线程调用 Hook 安装例程。这里是一个循环,它检查全局变量并在适当的时候退出循环。然后它将能够自行清理。相关代码如下:

static int willQuit = 0;
unsigned WINAPI MouseProcessingProc (void *param) {
try { // will catch exceptions and not propagate them
HHOOK mousehook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc,
NULL, 0);
if (mousehook == NULL) printf("Mousehook error %u\n",GetLastError());

while(true) {
MSG msg;
if (GetMessage(&msg,0,0,0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (willQuit) { printf("willQuit no longer 0!\n"); break; }
printf("Looped\n");
}
willQuit = 0;
UnhookWindowsHookEx(mousehook);

printf("Procedure completed without exceptional events.\n");
} catch (const std::string& s) {
printf("String exception: %s\n", s.c_str());
} catch (int i) {
printf("Int exception: %d\n", i);
} catch (...) {
printf("Unknown default exception!\n");
}
printf("Exiting thread execution.\n");
return 0;
}

void spawn() {
printf("Spawning Mouse thread\n");
_beginthreadex(NULL,0,MouseProcessingThreadProc,NULL,0,0);
}

void run() {
printf("Running Mouse routine\n");
MouseProcessingThreadProc(0);
}

void stop() {
printf("Stopping Mouse routine\n");
willQuit = 1;
}

unsigned WINAPI threadproc(void *param) {
Sleep(500);
printf("Spawned thread says 3");
Sleep(500);
printf("2");
Sleep(500);
printf("1\n");
Sleep(500);
printf("Spawned thread calls stop now -->\n");
stop();
}

int main() {
_beginthreadex(NULL,0,threadproc,NULL,0,0); // waiter and stopper thread
run(); // become the mousehook thread
printf("Completed\n");
return 0;
}

现在发生的事情是我的小消息轮询循环(while 循环)从未真正从 GetMessage 调用中返回,所以它永远无法到达它检查 willQuit。我已经用那些 printf 和 gdb 验证了这一点。为什么 GetMessage 不返回?有没有更好的方法来设置我的鼠标钩子(Hook)线程?还是我想做一些我不应该做的事情?

感谢阅读。

最佳答案

在您的 stop() 例程中,设置 willQuit 变量后,您还需要将任何消息发布到运行 MouseProcessingProc 的线程,因此 GetMessage 将返回。参见 PostThreadMessage API。

编辑:您还可以使用事件或其他同步对象,而不是使用 Windows 消息和消息泵。因此,消息泵将被诸如 WaitForSingleObject 之类的东西所取代,一些您可以发出信号的内核对象,例如事件。

关于c++ - Win32 -- 如何管理我的鼠标钩子(Hook)线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3221448/

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