lun*_*tix 2 c++ windows visual-studio visual-c++ chromium-embedded
我想自己绘制和移动窗户(使用铬嵌入式框架).要做到这一点,我需要一个全局回调鼠标移动,在我的窗口外 - 所以我安装了一个低级鼠标钩:
hMouseLLHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)mouseHookProc, hInstance, NULL);
Run Code Online (Sandbox Code Playgroud)
钩子简单地抓取鼠标事件并调用"CallNextHookEx".这里没有问题,一切都按照要求行事.我现在的问题是:如果调试器中断或抛出异常,我就不能再移动鼠标..
我尝试在另一个线程中处理钩子,如下所示:
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;
}
Run Code Online (Sandbox Code Playgroud)
但这也无法解决问题.是否有解决方法,解决方案或其他方法来执行此操作?另外,我认为可能没有必要使用低级别的钩子,因为我只需要了解它的运行情况,如果我是最后一个,那就不会有问题,所以系统/其他进程可以处理首先是鼠标回调.
更多地了解一下:当你拦截所有鼠标移动事件时,它们都会在你的钩子中结束,它可以修改或吞下它们.因此,系统会调用每个鼠标移动事件,并等待钩子例程完成,直到它再次调用钩子进行下一个挂起的鼠标移动事件.
猜猜你在钩子事件中闯入调试器会发生什么?在您完成挂钩程序之前不再有鼠标事件.通常情况下,您可以使用这样的中央挂钩来降低整个系统.但幸运的是,Windows确实预见到了糟糕的钩子.您会注意到,在一些超时后,系统会再次响应鼠标事件.我的猜测是,当它挂起一次时,Windows只是删除你的钩子.
现在关于调试:安全地进入调试器的唯一方法是在挂机后永远不要触摸鼠标.不太实际.唯一的出路是跟踪有趣的事情,并查看你的日志文件钩内发生了什么.如果您在示例代码之后如何挂钩鼠标和键盘事件,您可以在这里查看:
http://etwcontroler.codeplex.com/SourceControl/latest#ETWControler/Hooking/Hooker.cs
| 归档时间: |
|
| 查看次数: |
1804 次 |
| 最近记录: |