在鼠标挂钩中,滚轮增量始终为 0

eno*_*eht 2 c++ winapi

#include <iostream>
#include <windows.h>

LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam){
  if(wParam == WM_MOUSEWHEEL){
    std::cout << "wheel: " << GET_WHEEL_DELTA_WPARAM(wParam) << std::endl;
  }else{
    MOUSEHOOKSTRUCT* mouselparam = (MOUSEHOOKSTRUCT*)lParam;
    std::cout << "etc: " << wParam << " - " << mouselparam->pt.x << "x" << mouselparam->pt.y << std::endl;
  }
  return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int main(int argc, char *argv[]) {

    HHOOK hhkLowLevelMouse = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, 0, 0);

    MSG msg;
    while (!GetMessage(&msg, NULL, NULL, NULL)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    UnhookWindowsHookEx(hhkLowLevelMouse);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是完整的代码。

“etc:”按照我的预期完美地工作。

“wheel:”始终输出 0。

我错过了什么吗?

使用HIWORD代替GET_WHEEL_DELTA_WPARAM会产生相同的结果。

Rem*_*eau 5

GET_WHEEL_DELTA_WPARAM()只适用于wParam 真正的WM_MOUSEWHEEL窗口消息,不适wParam用于钩子WH_MOUSE_LL

\n

在钩子中,wParam仅仅是消息标识符本身,仅此而已。所有鼠标详细信息都存储MSLLHOOKSTRUCTlParam. 您尝试查看除 之外的 WM_MOUSEWHEEL所有鼠标消息,但您正在查看错误的结构(由,而不是)MOUSEHOOKSTRUCT使用。WH_MOUSEWH_MOUSE_LL

\n

根据LowLevelMouseProc 回调函数文档:

\n
\n
    \n
  • wParam\xc2\xa0[in]
    \n类型:\xc2\xa0WPARAM

    \n

    鼠标消息的标识符。此参数可以是以下消息之一:WM_LBUTTONDOWNWM_LBUTTONUPWM_MOUSEMOVEWM_MOUSEWHEELWM_MOUSEHWHEELWM_RBUTTONDOWN或\xc2\xa0 WM_RBUTTONUP

    \n
  • \n
  • lParam\xc2\xa0[in]
    \n类型:\xc2\xa0LPARAM

    \n

    指向 \xc2\xa0 结构的指针MSLLHOOKSTRUCT

    \n
  • \n
\n
\n

以及MSLLHOOKSTRUCT 结构文档:

\n
\n

mouseData
\n类型:\xc2\xa0DWORD

\n

如果消息是\xc2\xa0 WM_MOUSEWHEEL则该成员的高位字是wheel delta。低位字被保留。正值表示滚轮向前旋转,远离用户;负值表示滚轮向后旋转,朝向用户。滚轮单击定义为 \xc2\xa0 WHEEL_DELTA,即 120。

\n
\n

试试这个:

\n
LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam){\n    if (nCode == HC_ACTION) {\n        MSLLHOOKSTRUCT* mouselparam = (MSLLHOOKSTRUCT*)lParam;\n        if (wParam == WM_MOUSEWHEEL) {\n            short delta = HIWORD(mouselparam->mouseData); \n            // alternatively, GET_WHEEL_DELTA_WPARAM() would also work here:\n            // short delta = GET_WHEEL_DELTA_WPARAM(mouselparam->mouseData);\n            std::cout << "wheel: " << delta << std::endl;\n        }else{\n            std::cout << "etc: " << wParam << " - " << mouselparam->pt.x << "x" << mouselparam->pt.y << std::endl;\n        }\n    }\n    return CallNextHookEx(NULL, nCode, wParam, lParam);\n}\n
Run Code Online (Sandbox Code Playgroud)\n