WM_MOUSEWHEEL 消息:获取此消息时得到的鼠标坐标是屏幕坐标
[編輯] [转简体] (简体译文)概要
正文
接受一般的鼠标消息时(如 WM_MOUSEMOVE),从 lparam 得到的鼠标坐标是客户区坐标
见 https://docs.microsoft.com/zh-cn/windows/win32/inputdev/wm-mousemove :
lParam
低序单词指定游标的 x 坐标。 坐标相对于工作区的左上角。
高序单词指定游标的 y 坐标。 坐标相对于工作区的左上角。
但是,如果获取的是 WM_MOUSEWHEEL 消息,则得到的鼠标坐标是屏幕坐标
见 https://docs.microsoft.com/zh-CN/windows/win32/inputdev/wm-mousewheel :
lParam
低序单词指定指针的 x 坐标,相对于屏幕左上角。
高阶单词指定指针的 y 坐标,相对于屏幕左上角。
如果是前者,得到的坐标是客户区坐标,则肯定不会出现负数,所以使用 LOWORD 或 HIWORD 宏提取游标位置的 x 坐标和 y 坐标,按理来说是没问题的。
但是如果是后者,获取到的屏幕坐标就可能出现负数(多监视器),但是 LOWORD 和 HIWORD 宏都会产生无符号数量,所以此时就得用 GET_X_LPARAM 或 GET_Y_LPARAM 获取坐标。
看微软原文:
重要
请勿使用 LOWORD 或 HIWORD 宏提取游标位置的 x 坐标和 y 坐标,因为这些宏在具有多个监视器的系统上返回不正确的结果。 具有多个监视器的系统可以具有负 x 和 y 坐标, LOWORD 和 HIWORD 将坐标视为无符号数量。
注意:要使用 GET_X_LPARAM 或 GET_Y_LPARAM 宏提取 x 坐标或 y 坐标,需要包含 windowsx.h。
若要将获取到的屏幕坐标转换为客户区坐标,请使用 ScreenToClient 函数。