使用 SetWindowsHookEx 时灵敏度下降

问题描述

当我把钩子放在鼠标上时,我会周期性地失去灵敏度,它增加了大约 0.3 秒(大约两倍)。我怎样才能解决这个问题? 我的处理程序代码

LRESULT CALLBACK mouseProc(int Code,WParaM wParam,LParaM lParam){
MOUSEHOOKSTRUCT* pMouseStruct = (MOUSEHOOKSTRUCT*)lParam;
if (pMouseStruct != nullptr) {
    switch (wParam) {
    case WM_LBUTTONDOWN:
        std::cout << "WM_LBUTTONDOWN";
        break;
    case WM_LBUTTONUP:
        std::cout << "WM_LBUTTONUP";
        break;
    case WM_RBUTTONDOWN:
        std::cout << "WM_RBUTTONDOWN";
        break;
    case WM_RBUTTONUP:
        std::cout << "WM_RBUTTONUP";
        break;
    default:
        break;
    }
}
return CallNextHookEx(NULL,Code,wParam,lParam);}

我是这样挂的:

HHOOK hook = SetwindowsHookEx(WH_MOUSE_LL,mouseProc,NULL,0);

MSG message;
while (GetMessage(&message,0) > 0)
{
    TranslateMessage(&message);
    dispatchMessage(&message);
}

UnhookWindowsHookEx(hook);

解决方法

您在这段代码中失去了敏感性,因为 std::cout 非常慢。你需要对这种钩子做出非常快速的反应,否则你显然会失去敏感性。

如果您确实需要登录钩子,请使用 spdlog 之类的东西并异步记录所有内容。

此外,正如理查德在评论中提到的,你需要在钩子开始时这样的东西:

if (nCode < 0) // do not process message 
    return CallNextHookEx(hhook,nCode,wParam,lParam); 

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...