windows SDK如何在WM_MOUSEMOVE消息下获取鼠标移动的像素大小? 如题,小生初学windows SDK编程,望各位前辈指教,感激不尽!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 to Eleven[兔子党组织部长]:就是移动前鼠标的位置和移动后鼠标位置的差 to Eleven[兔子党组织部长]:我也明白要有个基点,我就是想以移动前的鼠标位置作为基点,但现在我只明白获取鼠标当前位置的坐标,就是不晓得如何获取本次移动前的坐标,这怎么办呢? to Eleven[兔子党组织部长]:哦,忘了说了,我做的是一个屏保程序,为了响应鼠标移动事件而退出屏保,就case了WM_MOUSEMOVE这个消息,但是单单这样做的话屏保只会闪烁一下就没了,所以我想用鼠标移动一定的范围大小后来响应鼠标移动的消息。所以不能点击鼠标。 CSDN 问题贴的通病!问题解决了都不肯说一下解决的方法 :(我替你说了吧:每次收到 WM_MOUSEMOVE 消息的时候都把坐标位置记下来,供下次收到 WM_MOUSEMOVE 消息时使用。你的帖子不光是给你自己解决问题的,应该让它能帮助更多的人。你做得越友好,下次愿意帮你的人就更多。与人方便,自己方便。————————————————————————————————基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :) to maquan:谢谢你的提醒,我是初来咋到,刚到CSDN,所以没什么这方面的经验,以后我会注意的,呵呵,不过我的方法不是这样的,是一个笨方法,我是在while(true)前面用了GetCursorPs(&cur1),然后在while(true)里面不断调用GetCursorPs(&cur2),并对两个坐标作差,如果差大于或者等于1,那么就退出程序,这方法貌似很笨哈,还望各位前辈指点呵呵再次谢谢你的提醒 你这个方法……有点问题。如果鼠标动了一下,然后就不再动了,那么你的程序就在那儿死循环了,屏保也就卡住了。其实我上面说的方法也比较糙,精致一点的做法应该是这样:屏保运行后,通过 GetCursorPos() 取出鼠标位置,作为参考点;以后收到 WM_MOUSEMOVE 消息的时候,把鼠标位置跟参考点比较,超过一定距离则做相应处理。而这个距离限制,体现了鼠标抖动的灵敏度,你可以自己定,也可以通过 GetSystemMetrics() 取 SM_CXDRAG/SM_CYDRAG,这样更友好一点。 to maquan:没有卡住啊,程序是正常结束运行了的,不过我明白我那方法确实有点笨,初学嘛,呵呵,非常感谢你的指点,又让我明白了一些没想到的东西 to maquan:很想加分给你,只是你来之前我已经结贴了,有点过意不去啊 “卡住”其实很不容易做到,要很碰巧才行。鼠标只移动一下就不再移动,这样你在消息响应函数中所有的 GetCursorPos() 得到的永远是相同的坐标。谢谢你的好意,其实分无所谓,我又不想在 CSDN 扬名立万,我参与讨论是为了学习、攒经验的,分只是浮云 :)不过我很在意楼主结贴时如何结分。凡是我参与过的贴子,我都会仔细看一下最后结贴时散分的情况,因为这能看出那些是真正有帮助的回贴,也能看出楼主本人的负责程度,甚至能看出他到底弄懂了多少。 to maquan: 我是这样做的,不知道是否会出现你所说的卡住的问题:如果你看见了,又得麻烦你一次,不好意思主函数:注:cur1,cur2是两个全局变量,用于记录坐标位置并进行减运算比较int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ ...... GetCursorPos(&cur1); while(true) { ...... if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))//从应用程序队列提取消息,处理后删除消息 { if(msg.message == WM_QUIT) break; //若接收到退出消息则退出程序 TranslateMessage(&msg); //将键盘消息组合成对应的字符消息 DispatchMessage(&msg); //将消息通过windows系统传递给窗口消息处理函数 } ...... return msg.wParam;}窗口消息处理函数:LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam){ switch(message) { case WM_KEYDOWN: //按下任意键后屏保程序退出 case WM_MOUSEMOVE: //鼠标移动操作屏保程序退出 cur2.x = LOWORD(lParam); cur2.y = HIWORD(lParam); if(cur2.x == cur1.x && cur2.y == cur1.y) break; case WM_LBUTTONDOWN: //鼠标左键按下屏保程序退出 case WM_RBUTTONDOWN: //鼠标右键按下屏保程序退出 case WM_DESTROY: //按下关闭按钮屏保程序退出 PostQuitMessage(0); break; default: //其它消息发送到windows默认窗口处理函数进行处理 return (DefWindowProc(hWnd,message,wParam,lParam)); } return 0;} hehe, 你这么做当然就没问题了。你前面可不是这么说的:所以我理解你是在处理 WM_MOUSEMOVE 的时候,先取 cur1,然后死循环取 cur2 …… to maquan: 实在是太感谢你了,感谢你的关注与指点,如果论坛里人人都有你这么好那就好了,呵呵,小生鞠躬谢过! 引用 3 楼 zwfgdlc 的回复:移动一个像素就算是变换了位置,只能得到移动了多少个像素点,不可以得到移动了多少物理尺寸。那么请问如何获得移动了多少个像素点呢?这个很简单,在两次WM_MOUSEMOVE里读鼠标两次的位置,一减就行了。WM_MOUSEMOVE的lParem字段的高低16位分别是像素的X坐标和Y坐标。 Winsock编程中两个客户如何进行通信? c++编写类似UltraEdit-32软件 奇怪,请说道说道 请问哪里能找到关于网上对弈程序设计的论文和资料 我想把数据表中的记录逐条读到并显示在CListControl控件中,请问该如何写。(数据库采用odbc链接正确) 请问在DLL中创建的窗口怎么接收不到消息???????????? socket关闭事件 按一个键,就能执行一个程序? ========VC窗体上的字体怎么改变呀 如何给非激活窗口用postmessage发送wm_keydown消息? win2000下的安装错误 汇编改成C语言
就是移动前鼠标的位置和移动后鼠标位置的差
我也明白要有个基点,我就是想以移动前的鼠标位置作为基点,但现在我只明白获取鼠标当前位置的坐标,就是不晓得如何获取本次移动前的坐标,这怎么办呢?
哦,忘了说了,我做的是一个屏保程序,为了响应鼠标移动事件而退出屏保,就case了WM_MOUSEMOVE这个消息,但是单单这样做的话屏保只会闪烁一下就没了,所以我想用鼠标移动一定的范围大小后来响应鼠标移动的消息。所以不能点击鼠标。
————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
谢谢你的提醒,我是初来咋到,刚到CSDN,所以没什么这方面的经验,以后我会注意的,呵呵,不过我的方法不是这样的,是一个笨方法,我是在while(true)前面用了GetCursorPs(&cur1),然后在while(true)里面不断调用
GetCursorPs(&cur2),并对两个坐标作差,如果差大于或者等于1,那么就退出程序,这方法貌似很笨哈,还望各位前辈指点呵呵再次谢谢你的提醒
没有卡住啊,程序是正常结束运行了的,不过我明白我那方法确实有点笨,初学嘛,呵呵,非常感谢你的指点,又让我明白了一些没想到的东西
很想加分给你,只是你来之前我已经结贴了,有点过意不去啊
我是这样做的,不知道是否会出现你所说的卡住的问题:如果你看见了,又得麻烦你一次,不好意思
主函数:
注:cur1,cur2是两个全局变量,用于记录坐标位置并进行减运算比较
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
...... GetCursorPos(&cur1);
while(true)
{
...... if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))//从应用程序队列提取消息,处理后删除消息
{
if(msg.message == WM_QUIT)
break; //若接收到退出消息则退出程序
TranslateMessage(&msg); //将键盘消息组合成对应的字符消息
DispatchMessage(&msg); //将消息通过windows系统传递给窗口消息处理函数
} ......
return msg.wParam;
}窗口消息处理函数:
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_KEYDOWN: //按下任意键后屏保程序退出
case WM_MOUSEMOVE: //鼠标移动操作屏保程序退出
cur2.x = LOWORD(lParam);
cur2.y = HIWORD(lParam);
if(cur2.x == cur1.x && cur2.y == cur1.y)
break;
case WM_LBUTTONDOWN: //鼠标左键按下屏保程序退出
case WM_RBUTTONDOWN: //鼠标右键按下屏保程序退出
case WM_DESTROY: //按下关闭按钮屏保程序退出
PostQuitMessage(0);
break;
default: //其它消息发送到windows默认窗口处理函数进行处理
return (DefWindowProc(hWnd,message,wParam,lParam));
} return 0;
}
所以我理解你是在处理 WM_MOUSEMOVE 的时候,先取 cur1,然后死循环取 cur2 ……
实在是太感谢你了,感谢你的关注与指点,如果论坛里人人都有你这么好那就好了,呵呵,小生鞠躬谢过!
只能得到移动了多少个像素点,
不可以得到移动了多少物理尺寸。
那么请问如何获得移动了多少个像素点呢?这个很简单,在两次WM_MOUSEMOVE里读鼠标两次的位置,一减就行了。WM_MOUSEMOVE的lParem字段的高低16位分别是像素的X坐标和Y坐标。