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

时间:2014-03-02 16:24:44

标签: c++ windows visual-studio visual-c++ chromium-embedded

我想自己绘制和移动窗户(使用铬嵌入式框架)。 要做到这一点,我需要一个全局回调鼠标移动,在我的窗口外 - 所以我安装了一个低级鼠标钩:

hMouseLLHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)mouseHookProc, hInstance, NULL);

hook simple抓取鼠标事件并调用“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;
}

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:3)

当你的调试器停止整个程序(它的所有线程)时 如果使用钩子,可能没有解决方法 不那么准确,但您可以在线程中轮询GetCursorPos。

相关问题