Windows 鼠标挂钩导致控制台延迟

Windows Mouse Hook Causes lag on console

我已经设置了一个低级鼠标挂钩。现在我正在控制台中记录事件。发生的事情是当我尝试使用滚动条滚动控制台时鼠标开始滞后!我看不到任何高 CPU 使用率,所以我猜这是由于事件没有被转发。

相关代码如下:

HHOOK mouseHook = SetWindowsHookExA(WH_MOUSE_LL, (HOOKPROC)mouse_hook, handle, 0);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0) != 0)
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
UnhookWindowsHookEx(mouseHook); 

而且,

LRESULT CALLBACK mouse_hook(int nCode, WPARAM wParam, LPARAM lParam){
    MSLLHOOKSTRUCT *data = (MSLLHOOKSTRUCT *)lParam;
    POINT mouse_point = data->pt;
    unsigned long mouseX = mouse_point.x;
    unsigned long mouseY = mouse_point.y;
    unsigned long timeStamp = data->time;
    unsigned long flag = data->flags;
    printf("mouse_hook :\nPOS: (%ld, %ld)\nTimeStamp: %ld\n\n", mouseX, mouseY, timeStamp);
    switch(wParam){
        case WM_LBUTTONDOWN:{
            break;
        }
        case WM_LBUTTONUP:{
            break;
        }
        case WM_MOUSEMOVE:{
            break;
        }
        case WM_MOUSEWHEEL:{
            break;
        }
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

如评论中所述,在如此频繁的回调函数中调用 printf 将是一个问题。 printf 和 Windows 控制台 API 通常是慢速函数。

如果您需要此日志记录功能,则:

  • 创建一个单独的线程来执行所有打印。
  • 通过使用互斥锁或临界区,创建线程安全访问的某种 FIFO 队列方式。
  • 让鼠标回调将结构项目放入队列并让打印线程删除它们。
  • 您可以选择在没有工作时让打印线程休眠,然后通过设置事件让鼠标回调将其唤醒。