我想自己绘制和移动我的窗户(使用铬embedded式框架)。 要做到这一点,我需要一个全局的callback,当鼠标移动,我的窗口之外 – 所以我安装了一个低级别的鼠标钩子:
hMouseLLHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)mouseHookProc, hInstance, NULL);
hook简单的抓取鼠标事件并调用“CallNextHookEx”。 这里没有任何问题,所有的东西都是如此。 我现在的问题:如果debugging器中断或抛出exception,我不能移动鼠标了。
我尝试在另一个线程中处理钩子,如下所示:
HANDLE mouseProcHandle = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)mouseProcessor, NULL, NULL, &dwMouseProcThread); DWORD WINAPI Win32Application::mouseProcessor(LPVOID lpParm) { hMouseLLHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)mouseHookProc, ((Win32Application*)Application::getInstance())->hInstance, NULL); MSG message; while (GetMessage(&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } UnhookWindowsHookEx(hMouseLLHook); return 0; }
但是这也不能解决问题。 有没有解决方法,解决scheme或其他方法来做到这一点? 另外,我认为一个低级别的钩子可能不是必要的,因为我只需要知道这个问题,如果我是最后一个,那么系统/其他进程就可以处理首先鼠标callback。
当你的调试器停止整个程序(它的所有线程)
如果使用钩子,可能没有解决方法。
不是很准确,但是你可以在一个线程中轮询GetCursorPos。
为了更清楚地说明一下:当你拦截所有的鼠标移动事件时,它们都会在你的钩子中被修改或吞下。 因此,系统会调用每个鼠标移动事件挂钩,并等待您的挂钩例程完成,直到它再次调用您的挂钩为下一个悬而未决的鼠标移动事件。
猜猜当你在钩子事件中进入调试器时会发生什么? 除非你已经通过你的钩子程序,否则没有更多的鼠标事件。 通常情况下,你可以用这样一个中央钩子来降低整个系统。 但幸运的是,Windows确实预料到了坏的一面。 你会注意到,在一些超时之后,系统再次响应鼠标事件。 我的猜测是,当Windows挂起一次的时候,它只是简单的删除你的挂钩。
现在要进行调试:安全地进入调试器的唯一方法是在进入钩子之后永远不要触摸鼠标。 不太实际。 唯一的出路是追踪有趣的事情,并查看你的日志文件在钩子里面发生了什么。 如果你是在示例代码之后如何挂钩鼠标和键盘事件,你可以看看这里:
http://etwcontroler.codeplex.com/SourceControl/latest#ETWControler/Hooking/Hooker.cs