如题,小生初学windows SDK编程,望各位前辈指教,感激不尽!!!

解决方案 »

  1.   

    to Eleven[兔子党组织部长]:
    就是移动前鼠标的位置和移动后鼠标位置的差
      

  2.   

    to Eleven[兔子党组织部长]:
    我也明白要有个基点,我就是想以移动前的鼠标位置作为基点,但现在我只明白获取鼠标当前位置的坐标,就是不晓得如何获取本次移动前的坐标,这怎么办呢?
      

  3.   

    to Eleven[兔子党组织部长]:
    哦,忘了说了,我做的是一个屏保程序,为了响应鼠标移动事件而退出屏保,就case了WM_MOUSEMOVE这个消息,但是单单这样做的话屏保只会闪烁一下就没了,所以我想用鼠标移动一定的范围大小后来响应鼠标移动的消息。所以不能点击鼠标。
      

  4.   

    CSDN 问题贴的通病!问题解决了都不肯说一下解决的方法 :(我替你说了吧:每次收到 WM_MOUSEMOVE 消息的时候都把坐标位置记下来,供下次收到 WM_MOUSEMOVE 消息时使用。你的帖子不光是给你自己解决问题的,应该让它能帮助更多的人。你做得越友好,下次愿意帮你的人就更多。与人方便,自己方便。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  5.   

    to maquan:
    谢谢你的提醒,我是初来咋到,刚到CSDN,所以没什么这方面的经验,以后我会注意的,呵呵,不过我的方法不是这样的,是一个笨方法,我是在while(true)前面用了GetCursorPs(&cur1),然后在while(true)里面不断调用
    GetCursorPs(&cur2),并对两个坐标作差,如果差大于或者等于1,那么就退出程序,这方法貌似很笨哈,还望各位前辈指点呵呵再次谢谢你的提醒
      

  6.   

    你这个方法……有点问题。如果鼠标动了一下,然后就不再动了,那么你的程序就在那儿死循环了,屏保也就卡住了。其实我上面说的方法也比较糙,精致一点的做法应该是这样:屏保运行后,通过 GetCursorPos() 取出鼠标位置,作为参考点;以后收到 WM_MOUSEMOVE 消息的时候,把鼠标位置跟参考点比较,超过一定距离则做相应处理。而这个距离限制,体现了鼠标抖动的灵敏度,你可以自己定,也可以通过 GetSystemMetrics() 取 SM_CXDRAG/SM_CYDRAG,这样更友好一点。
      

  7.   

    to maquan:
    没有卡住啊,程序是正常结束运行了的,不过我明白我那方法确实有点笨,初学嘛,呵呵,非常感谢你的指点,又让我明白了一些没想到的东西
      

  8.   

    to maquan:
    很想加分给你,只是你来之前我已经结贴了,有点过意不去啊
      

  9.   

    “卡住”其实很不容易做到,要很碰巧才行。鼠标只移动一下就不再移动,这样你在消息响应函数中所有的 GetCursorPos() 得到的永远是相同的坐标。谢谢你的好意,其实分无所谓,我又不想在 CSDN 扬名立万,我参与讨论是为了学习、攒经验的,分只是浮云  :)不过我很在意楼主结贴时如何结分。凡是我参与过的贴子,我都会仔细看一下最后结贴时散分的情况,因为这能看出那些是真正有帮助的回贴,也能看出楼主本人的负责程度,甚至能看出他到底弄懂了多少。
      

  10.   

    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;
    }
      

  11.   

    hehe, 你这么做当然就没问题了。你前面可不是这么说的:
    所以我理解你是在处理 WM_MOUSEMOVE 的时候,先取 cur1,然后死循环取 cur2 ……
      

  12.   

    to maquan:
        实在是太感谢你了,感谢你的关注与指点,如果论坛里人人都有你这么好那就好了,呵呵,小生鞠躬谢过!
      

  13.   

    引用 3 楼 zwfgdlc 的回复:移动一个像素就算是变换了位置,
    只能得到移动了多少个像素点,
    不可以得到移动了多少物理尺寸。
    那么请问如何获得移动了多少个像素点呢?这个很简单,在两次WM_MOUSEMOVE里读鼠标两次的位置,一减就行了。WM_MOUSEMOVE的lParem字段的高低16位分别是像素的X坐标和Y坐标。