#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会产生相同的结果。
GET_WHEEL_DELTA_WPARAM()只适用于wParam 真正的WM_MOUSEWHEEL窗口消息,不适wParam用于钩子WH_MOUSE_LL。
在钩子中,wParam仅仅是消息标识符本身,仅此而已。所有鼠标详细信息都存储MSLLHOOKSTRUCT在lParam. 您尝试查看除 之外的 WM_MOUSEWHEEL所有鼠标消息,但您正在查看错误的结构(由,而不是)MOUSEHOOKSTRUCT使用。WH_MOUSEWH_MOUSE_LL
\n\n\n
\n- \n
\n
wParam\xc2\xa0[in]
\n类型:\xc2\xa0WPARAM鼠标消息的标识符。此参数可以是以下消息之一:
\nWM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE、WM_MOUSEWHEEL、WM_MOUSEHWHEEL、WM_RBUTTONDOWN或\xc2\xa0WM_RBUTTONUP。- \n
\n
lParam\xc2\xa0[in]
\n类型:\xc2\xa0LPARAM指向 \xc2\xa0 结构的指针
\nMSLLHOOKSTRUCT。
以及MSLLHOOKSTRUCT 结构文档:
\n\n\n\n
mouseData
\n类型:\xc2\xa0DWORD如果消息是\xc2\xa0
\nWM_MOUSEWHEEL,则该成员的高位字是wheel delta。低位字被保留。正值表示滚轮向前旋转,远离用户;负值表示滚轮向后旋转,朝向用户。滚轮单击定义为 \xc2\xa0WHEEL_DELTA,即 120。
试试这个:
\nLRESULT 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}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
494 次 |
| 最近记录: |