Low Level Maushook - Maustaste im WM_MOUSEMOVE ermitteln



  • hallo, ich habe mir einen Low Level Maushook für WinXP gebastelt, welcher auch ganz gut funktioniert.
    allerdings möchte ich im WM_MOUSEMOVE feststellen, welche maustaste zur zeit gedrückt ist.
    ich hab es bereits mit GetAsyncKeyState(VK_LBUTTON) & 0x8000 versucht, funzt aber leider nicht.
    weiters habe ich in der msdn noch nichts gefunden.
    vielleicht kann mir jemand einen tip geben. danke !



  • WM_MOUSEMOVE
    ...
    WPARAM wParam, // key indicators
    ...
    wParam
    Indicates whether various virtual keys are down. This parameter can be one or more of the following values.

    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 Windows 2000/XP: The first X button is down.
    MK_XBUTTON2 Windows 2000/XP: The second X button is down.



  • Ich habe meinen Maushook folgendermassen programmiert:
    (Leider weiss ich immer noch nicht, wie ich an die Taste rankomme..... 😕 )

    LRESULT CALLBACK LLMouseHook(int nCode, WPARAM wParam,LPARAM lParam)
    {
        if(nCode==ACTION)
        {
            MSLLHOOKSTRUCT *mhs = (MSLLHOOKSTRUCT*) lParam;
            if(wParam==WM_MOUSEMOVE)
            {
                // hier soll code nur ausgeführt werden wenn z.b.
                // linke maustaste gedrückt iss.
                return 1;
            }
        }
        return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
    }
    

    Die Parameter dieser Funktion sind:

    nCode:
    Ist dieser Parameter gleich HC_ACTION, enthalten die Parameter wParam und lParam Infos über die Mausnachricht.
    Ist er HC_NOREMOVE, gilt dassselbe wie für HC_ACTION, ausser dass die Nachricht aus der Nachrichtenwarteschlange entfernt wurde. ist der wert kleiner null, muss die hookprozedur die nachricht an die funktion callnexthookex weiter geben, ohne sie weiter zu verarbeiten.
    in diesem fall sollte sie die rückgabewerte von callnexthook zurückgeben.

    wParam:
    Die Mausnachricht kann eine der folgenden Nachrichten sein: **// KEIN KEYINDICATOR !!!**WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSEMOVE,WM_MOUSEWHEEL,WM_RBUTTONDOWN,WM_RBUTTONUP.

    lParam:
    Zeiger auf eine MSLLHOOKSTRCUT-Struktur

    Rückgabewert:
    LRESULT ist ncode kleiner als null, dann muss der rückgabewert von CallnextHookEx zurückgegeben werden. Ist nCode grösser als null, empfiehlt es sich , dass der Rückgabewert von CallNextHookEx zurückgegeben wird.Andernfalls werden andere für WH_MOUSE_LL installierte Hooks nicht aufgerufen und es sollte null zurückgegeben werden.

    In der MSLLHOOKSTRUCT - Struktur konnte ich auch noch nix finden....

    typedef struct tagMSLLHOOKSTRUCT
    {
        POINT pt;
        DWORD mouseData;
        DWORD flags;
        DWORD time;
        ULONG_PTR dwExtraInfo;
    } MSLLHOOKSTRUCT;
    

    pt:
    Die x-,y-Koordinaten des Cursors in Relation zum Monitor

    mouseData:
    Wenn die Message WM_MOUSEWHEEL ist, ist das hochrangige wort dieses teils gelich dem rad-delta. das niedrigrangige wort ist reserviert.
    ein positiver wert zeigt an, dass das Rad vorwärts gedreht wurde, ein negativer, das rückwärts gedreht wurde. Ein Radclick ist als WHEEL_DELTA gleich 120 definiert.

    Ist die message WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLCK,WM_NCXBUTTONDOWN,WM_NCXBUTTONUP, WM_NCBUTTONDBLCLK, spezifiziert das hochrangige wort, welche x-schaltfläche gedrückt bzw. losgelassen wurde, das niederrangige ist reserviert. dieser wert kann eine der Werte XBUTTON1 oder XBUTTON2 , oder beide sein.
    Andernfalls wird mouseData nicht verwendet.

    flags:
    Nur der erste Abschnitt wird verwendet. Ist er auf 1, wurde der Event eingespeist, andernfalls 0.

    time:
    Zeitstempel der Nachricht.

    dwExtraInfo:
    Zusätzliche Info zur Message

    Ich habe natürlich im hook (dort wo der kommentar steht) bereits folgendes versucht, was aber auch nicht funktioniert
    (warum weiss ich noch nicht - ich bekomme immer null zurück.....).

    if(HIBYTE(GetAsyncKeyState(VK_LBUTTON)))
        AfxMessageBox("Key down");
    

    Beschreibung von GetAsyncKeyState:

    SHORT GetAsyncKeyState(int nVirtKey);
    

    Stellt fest, ob gerade eine Taste gedrückt ist, oder ob sie seit dem letzten Aufruf von GetAsyncKeyState gedrückt wurde.

    Parameter:

    nVirtKay - der virtuelle tastencode für die taste.
    unter win 2k kann der rechte und linke virtualle tastencode für shift, ctrl und menütasten hergenommen werden , um diese zu unterscheiden.

    Rückgabewert:

    SHORT Das obere Byte ist 1, wenn die Taste gedrückt ist, sonst 0.
    Das untere Byte ist 1, wenn die Taste seit dem letzten Aufruf gedrückt wurde, sonst 0.
    Diese Werte werden mit den Makros LOBYTE und HIBYTE ermittelt.

    BITTE UM HILFE !!!



  • Langsam werd ich blond....... 😕 😕 😉


Anmelden zum Antworten