这是一个Win32程序,我写了一个CaptureMousePosition函数来捕获鼠标的位置。
我在WM_MOUSEMOVE消息中调用该函数。
然后我运行程序。当我的鼠标在红点上移动时,它是(126,112)。这里没有问题。
但当我的鼠标在蓝点上移动时,它变为(960,940)。如何发生,我不明白,为什么红点是(126,112),但蓝点是(960,940)。蓝色point应该是(< 126,< 112)。如何修复它。
答案 0 :(得分:5)
一切都很好。蓝点的坐标为X = 96
和Y = 94
。您看到X = 960
,因为您没有删除X = 100
剩余的0。如果您使用调试器逐步执行代码,您会注意到这些值很好。
答案 1 :(得分:2)
documentation for WM_MOUSEMOVE
明确指出:
使用以下代码获取水平和垂直位置:
xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);
如上所述,x坐标是返回值的低阶; y坐标是高阶短路(两者都代表有符号值,因为它们可以在具有多个监视器的系统上取负值)。如果将返回值赋给变量,则可以使用MAKEPOINTS宏从返回值中获取POINTS结构。您还可以使用GET_X_LPARAM或GET_Y_LPARAM宏来提取x坐标或y坐标。
重要不要使用LOWORD或HIWORD宏来提取光标位置的x坐标和y坐标,因为这些宏会在具有多个监视器的系统上返回不正确的结果。具有多个监视器的系统可以具有负x和y坐标,而LOWORD和HIWORD将坐标视为无符号数量。
改变这个:
short nX;
nX = (short)LOWORD(lParam);
short nY;
nY = (short)HIWORD(lParam);
对此:
short nX;
nX = GET_X_LPARAM(lParam);
short nY;
nY = GET_Y_LPARAM(lParam);
或者这个:
POINTS pt;
pt = MAKEPOINTS(lParam);
short nX;
nX = pt.x;
short nY;
nY = pt.y;
更新:来自documentation的其他注意事项:
光标移动时发布到窗口。如果未捕获鼠标,则会将消息发布到包含光标的窗口。否则,消息将发布到捕获鼠标的窗口。
这意味着如果通过SetCapture()
捕获了鼠标,则报告的坐标将相对于正在进行捕获的窗口,而不是鼠标实际移动的窗口。
答案 2 :(得分:1)
没有显示您的代码,很难回答,但我想,问题出在Screen vs. Client坐标中。