捕获鼠标位置

时间:2013-12-18 19:05:32

标签: c++ winapi

这是一个Win32程序,我写了一个CaptureMousePosition函数来捕获鼠标的位置。This is CaptureMousePosition function.

我在WM_MOUSEMOVE消息中调用该函数。This is where I call the function.

然后我运行程序。当我的鼠标在红点上移动时,它是(126,112)。这里没有问题。run the program.

但当我的鼠标在蓝点上移动时,它变为(960,940)。如何发生,我不明白,为什么红点是(126,112),但蓝点是(960,940)。蓝色point应该是(< 126,< 112)。如何修复它。enter image description here

3 个答案:

答案 0 :(得分:5)

一切都很好。蓝点的坐标为X = 96Y = 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坐标中。