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 队列方式。
- 让鼠标回调将结构项目放入队列并让打印线程删除它们。
- 您可以选择在没有工作时让打印线程休眠,然后通过设置事件让鼠标回调将其唤醒。
我已经设置了一个低级鼠标挂钩。现在我正在控制台中记录事件。发生的事情是当我尝试使用滚动条滚动控制台时鼠标开始滞后!我看不到任何高 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 队列方式。
- 让鼠标回调将结构项目放入队列并让打印线程删除它们。
- 您可以选择在没有工作时让打印线程休眠,然后通过设置事件让鼠标回调将其唤醒。