c ++ - MouseProc (WH\_MOUSE) begivenheder, der fyrer to gange

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil stille et spørgsmål om et problem, jeg har oplevet.


Jeg installerer en WH\_MOUSE -krog ved hjælp af følgende funktion:


hMouseHook = SetWindowsHookEx(WH\_MOUSE, (HOOKPROC)MouseHookProc, dllInstance, threadId);


threadId opnås ved hjælp af GetWindowThreadProcessId -funktionen. Dette lykkes, fordi krogen kun virker i den proces, som jeg vil have det til. dllInstance opnås fra et DllMain indtastningssted. For det er det værd, er hMouseHook i et delt datasegment ( #pragma data\_seg ('delt') ). Følgende kode viser MouseHookProc , der findes i ovenstående SetWindowsHookEx -opkald:


LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode < 0 || !isRunning())
        return CallNextHookEx(hMouseHook, nCode, wParam, lParam);

    switch (wParam) {
        case WM\_LBUTTONDOWN: {
            OutputDebugStringA("Mouse button down!
");
            break;
        }
    }

    return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}


Under testningen returnerer isRunning () TRUE (jeg dobbeltkrydset). Mit problem er, at 'museknappen nede!' Meddelelsen udskrives to gange hver gang den venstre museknap holdes nede. Hvorfor sker dette med den angivne kode? Jeg bruger i øjeblikket en løsning, men vil gerne forstå, hvorfor det sker.


Jeg debugger lanceringsprogrammet (den, der kalder DLL'ens funktion indeholdende SetWindowsHookEx ) i Visual Studio 2015 og vedhæfter den til den proces, jeg bruger (Fejlfinding -> Vedhæft til proces).


Tak på forhånd for eventuelle svar.


Rediger: Det forekommer kun første gang proceduren kaldes nCode == HC\_ACTION. Jeg antager, at dette er et svar på mit spørgsmål, men jeg vil gerne vide, hvorfor min procedure kaldes anden gang med nCode == HC\_NOREMOVE?

Bedste reference


Kaldet en gang med nCode == HC\_NOREMOVE og derefter igen med nCode == HC\_ACTION.