首页 > 解决方案 > 使用 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, NULL, 0, 0) > 0)
{
    TranslateMessage(&message);
    DispatchMessage(&message);
}

UnhookWindowsHookEx(hook);

标签: c++winapisetwindowshookex

解决方案


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

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

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

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

推荐阅读