低级鼠标钩 - 断点上的鼠标冻结

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)

但这也无法解决问题.是否有解决方法,解决方案或其他方法来执行此操作?另外,我认为可能没有必要使用低级别的钩子,因为我只需要了解它的运行情况,如果我是最后一个,那就不会有问题,所以系统/其他进程可以处理首先是鼠标回调.

Alo*_*aus 5

更多地了解一下:当你拦截所有鼠标移动事件时,它们都会在你的钩子中结束,它可以修改或吞下它们.因此,系统会调用每个鼠标移动事件,并等待钩子例程完成,直到它再次调用钩子进行下一个挂起的鼠标移动事件.

猜猜你在钩子事件中闯入调试器会发生什么?在您完成挂钩程序之前不再有鼠标事件.通常情况下,您可以使用这样的中央挂钩来降低整个系统.但幸运的是,Windows确实预见到了糟糕的钩子.您会注意到,在一些超时后,系统会再次响应鼠标事件.我的猜测是,当它挂起一次时,Windows只是删除你的钩子.

现在关于调试:安全地进入调试器的唯一方法是在挂机后永远不要触摸鼠标.不太实际.唯一的出路是跟踪有趣的事情,并查看你的日志文件钩内发生了什么.如果您在示例代码之后如何挂钩鼠标和键盘事件,您可以在这里查看:

http://etwcontroler.codeplex.com/SourceControl/latest#ETWControler/Hooking/Hooker.cs

  • `Hooker.cs` - 经典! (2认同)