我在做global mouse hook的时候发现鼠标不动的时候按键也会产生WM_MOUSEMOVE消息,怎么搞的?
LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
{
if (nCode>=0) 

if (wparam==WM_MOUSEMOVE) //鼠标不动的时候按下左键或右键怎么也会产生WM_MOUSEMOVE消息?
{
if (glhRecieveWnd)
{
::SendMessage(glhRecieveWnd,LINEUSE_MOUSEDOWN,wparam,lparam);

}
return 0;
}
else
{
return CallNextHookEx
}

}
(glhHookMouse,nCode,wparam,lparam); //继续传递消息 
}

解决方案 »

  1.   

    小弟我也发生过类似的现象,我在PreTranslateMessage(MSG *pMsg)里面,
    好像是一些无法解析的键盘消息,就会发生WM_MOUSEMOVE,具体的不知道,但是发生过这样的现象。
      

  2.   

    就是会发生这个情况,现在我要区分鼠标拖曳还是单击都没法实现,因为wparam==WM_MOUSEMOVE总是判断为true,我用的是xp+vc7。
      

  3.   

    surely, just see the snippet from MSDN :WM_MOUSEMOVE
    The WM_MOUSEMOVE message is posted to a window when the cursor moves. If the mouse is not captured, the message is posted to the window that contains the cursor. Otherwise, the message is posted to the window that has captured the mouse. WM_MOUSEMOVE 
    fwKeys = wParam;        // key flags 
    xPos = LOWORD(lParam);  // horizontal position of cursor 
    yPos = HIWORD(lParam);  // vertical position of cursor 
     
    Parameters
    fwKeys 
    Value of wParam. Indicates whether various virtual keys are down. This parameter can be any combination of the following values: Value Description 
    MK_CONTROL Set if the ctrl key is down. 
    MK_LBUTTON Set if the left mouse button is down. 
    MK_MBUTTON Set if the middle mouse button is down. 
    MK_RBUTTON Set if the right mouse button is down. 
    MK_SHIFT Set if the shift key is down. 
    xPos 
    Value of the low-order word of lParam. Specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area. 
    yPos 
    Value of the high-order word of lParam. Specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area. 
    Res
    The MAKEPOINTS macro can be used to convert the lParam parameter to a POINTS structure. QuickInfo
      Windows NT: Requires version 3.1 or later.
      Windows: Requires Windows 95 or later.
      Windows CE: Requires version 1.0 or later.
      Header: Declared in winuser.h.See Also
    Mouse Input Overview, Mouse Input Messages, GetCapture,MAKEPOINTS,POINTS, SetCapture  
      

  4.   

    区分鼠标拖曳还是单击只能通过判断LBUTTONDOWN LBUTTONUP RBUTTONDOWN RBUTTONUP来实现,中间还要设置SetCapture,很经典的程序技巧。
      

  5.   

    不过我还是不太明白哟。呵呵,我很菜的。我现在在做一个全局鼠标hook,我用一个全局变量保存WM_LBUTTONDOWN,然后判断WM_MOUSEMOVE用来做鼠标左键按下时在屏幕上绘图,但是如果这样做的话鼠标就不能响应菜单的单击,我没有设SetCapture,应该怎么做?程序如下:
    LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
    {
    if (nCode>=0) 

    (wparam==WM_LBUTTONDOWN)
    glbMouseDown=true;
    if (wparam==WM_LBUTTONUP)
    glbMouseDown=false;
    if (wparam==WM_MOUSEMOVE && glbMouseDown)//按下左键并移动
    {
    if (glhRecieveWnd)
    {
    ::SendMessage(glhRecieveWnd,LINEUSE_MOUSEDOWN,wparam,lparam);

    }
    return 0;
    }
    else
    {
    return CallNextHookEx(glhHookMouse,nCode,wparam,lparam); //继续传递消息 
    }


    }
      

  6.   

    我现在把这个hook的消息改成了WH_MOUSE_LL,好像解决了这个问题,不过不知道为什么。