我在看spy++时看到WM_MOUSEMOVE后面还跟了一个fwkeys,可以知道鼠标按键情况,我在做mouse hook,需要用到fwkeys,该怎么用?

解决方案 »

  1.   

    WPARAM wParam,   // key indicators
    是从wParam转化过来的吧,fwKeys = GET_KEYSTATE_WPARAM(wParam);MK_CONTROL The CTRL key is down. 
    MK_LBUTTON The left mouse button is down. 
    MK_MBUTTON The middle mouse button is down. 
    MK_RBUTTON The right mouse button is down. 
    MK_SHIFT The SHIFT key is down. 
    MK_XBUTTON1 The first X button is down. 
    MK_XBUTTON2 The second X button is down. 
      

  2.   

    我鼠标hook的MouseProc参数wparam已经是WM_MOUSEMOVE了,那鼠标的按键信息还有吗?spy++是怎么获得的?
      

  3.   

    fwKeys = GET_KEYSTATE_WPARAM(wParam);
      

  4.   

    好象没用GET_KEYSTATE_WPARAM(wParam)好象就是LOWORD(wParam),但是在我的鼠标hook里面WM_MOUSEMOVE是512,LOWORD后还是512啊.
      

  5.   

    为什么要LOWORD(wParam),鼠标的位置在lParam中。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 
      

  6.   

    因为在鼠标hook里面wparam==WM_MOUSEMOVE,lparam是鼠标位置,我就不知道MK_LBUTTON在哪里了。spy++为什么知道?
      

  7.   

    hook中的wParam和lParam与消息中的不是一回事。
    消息的名字在wParam中,消息的参数全在lParam中,
    将lParam转换成相应的结构就成了。下面共参考://**********************鼠标监视程序**********************
    LRESULT WINAPI MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    if (nCode < 0 || nCode == HC_NOREMOVE)
            return (CallNextHookEx(g_hMouseHook,nCode,wParam,lParam));    LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lParam; if(wParam == WM_LBUTTONUP)
    {
    }
    else if(wParam == WM_RBUTTONUP)
    {
            CString sTemp;
    sTemp.Format("X%dY%d",pMouseHook->pt.x,pMouseHook->pt.y);
            lstrcpy(szPlayText,sTemp);
            ::PostMessage(g_hMainWnd, WM_READOUT,0,0);
    } return (CallNextHookEx(g_hMouseHook,nCode,wParam,lParam));
    }
    MOUSEHOOKSTRUCT
    The MOUSEHOOKSTRUCT structure contains information about a mouse event passed to a WH_MOUSE hook procedure, MouseProc. typedef struct tagMOUSEHOOKSTRUCT { // ms 
        POINT pt; 
        HWND  hwnd; 
        UINT  wHitTestCode; 
        DWORD dwExtraInfo; 
    } MOUSEHOOKSTRUCT; 
     
    Members
    pt 
    Specifies aPOINT structure that contains the x- and y-coordinates of the cursor, in screen coordinates. 
    hwnd 
    Handle to the window that will receive the mouse message corresponding to the mouse event. 
    wHitTestCode 
    Specifies the hit-test value. For a list of hit-test values, see the description of theWM_NCHITTEST message. 
    dwExtraInfo 
    Specifies extra information associated with the message. 
    QuickInfo
      Windows NT: Requires version 3.1 or later.
      Windows: Requires Windows 95 or later.
      Windows CE: Unsupported.
      Header: Declared in winuser.h.See Also
    Hooks Overview, Hook Structures, MouseProc,POINT, SetWindowsHookEx,WM_NCHITTEST 
      

  8.   

    我看了一下,好象lparam里面没有MK_LBUTTON?那spy++怎么获得WM_MOUSEMOVE里面的fwkeys:MK_LBUTTON?
      

  9.   

    fwKeys = GET_KEYSTATE_WPARAM(wParam);
      

  10.   

    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    if (nCode < 0)
           return CallNextHookEx(g_hGetMsgHook,nCode,wParam,lParam);
    if(((LPMSG)lParam)->message == WM_MOUSEMOVE &&
    ((LPMSG)lParam)->wParam == MK_LBUTTON)
    {
    MessageBeep(0);
    }
    ..............