Sluit de muis aan om gebeurtenissen buiten een toepassing te vangen

Leer hoe u de muisactiviteit kunt volgen, zelfs als uw Delphi-applicatie niet actief is, in de dienblad of doet geen gebruikersinterface hebben helemaal niet.

Door een systeembrede (of globale) muishaak te installeren, kunt u controleren wat de gebruiker doet met de muis en dienovereenkomstig te handelen.

Wat is een haak en hoe werkt het?

Kortom, een haak is een (Bel terug) functie die u kunt maken als onderdeel van een DLL (Dynamic Link Library) of uw applicatie om het reilen en zeilen binnen het Windows-besturingssysteem te controleren.
Er zijn 2 soorten haken: wereldwijd en lokaal. Een lokale hook controleert dingen die alleen gebeuren voor een specifiek programma (of thread). Een globale hook bewaakt het hele systeem (alle threads).

Om een ​​globale hook te maken heb je 2 projecten nodig, 1 om het uitvoerbare bestand te maken en 1 om een ​​DLL te maken die de hook-procedure bevat.

Ons artikel over werken met toetsenbordhaken van Delphi legt uit hoe de toetsenbordinvoer kan worden onderschept voor bedieningselementen die de invoerfocus niet kunnen ontvangen (zoals TImage).

instagram viewer

De muis haken

Door het ontwerp is de beweging van de muis beperkt door de grootte van uw bureaubladscherm (inclusief de Windows-taakbalk). Wanneer u de muis naar de linker / rechter / boven / onderrand beweegt, zal de muis "stoppen" - zoals verwacht (als u niet meer dan één monitor heeft).

Hier is een idee voor de systeembrede muishaak: als u bijvoorbeeld de muis naar de rechterkant van het scherm wilt verplaatsen wanneer het naar de linkerrand beweegt (en het "aanraakt"), zou je een globale muishaak kunnen schrijven om de muis te verplaatsen wijzer.

U begint met het maken van een Dynamic Link Library-project. De DLL moet twee methoden exporteren: "HookMouse" en "UnHookMouse".

De HookMouse-procedure roept de SetWindowsHookEx API die de "WH_MOUSE" doorgeeft voor de eerste parameter - en dus een hook-procedure installeert die muisberichten bewaakt. Een van de parameters van de SetWindowsHookEx is uw callback-functie die Windows zal oproepen wanneer er een muisbericht moet worden verwerkt:

SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);

De laatste parameter (waarde = 0) in de SetWindowsHookEx definieert dat we een globale hook registreren.

De HookProc parseert de muisgerelateerde berichten en stuurt een aangepast bericht ("MouseHookMessage") naar ons testproject:

functie HookProc (nCode: Integer; MsgID: WParam; Gegevens: LParam): LResult; stdcall;

var

 mousePoint: TPoint;

 notifyTestForm: boolean;

 MouseDirection: TMouseDirection;

beginnen

 mousePoint: = PMouseHookStruct (Data) ^. pt;


 notifyTestForm: = false;


als (mousePoint. X = 0) vervolgens

beginnen

 Ramen. SetCursorPos (-2 + scherm. Breedte, mousePoint.y);

 notifyTestForm: = waar;

 MouseDirection: = mdRight;

einde;

...
als informTestForm vervolgens

beginnen

 PostMessage (FindWindow ('TMainHookTestForm', nihil), MouseHookMessage, MsgID, Integer (MouseDirection));

einde;

Resultaat: = CallNextHookEx (Hook, nCode, MsgID, Data);
einde;

Tip: Lees de Win32 SDK Help-bestanden om meer te weten te komen over het PMouseHookStruct-record en de handtekening van de HookProc-functie.

Notitie: Een hook-functie hoeft niets te verzenden - de PostMessage-aanroep wordt alleen gebruikt om aan te geven dat de DLL kan communiceren met de 'buitenwereld'.

Muishaak "Listener"

Het bericht "MouseHookMessage" wordt in uw testproject geplaatst - een formulier met de naam "TMainHookTestForm". U overschrijft de WndProc-methode om het bericht te ontvangen en handelt indien nodig:

procedure TMainHookTestForm. WndProc (var Bericht: TMessage);

beginnen

geërfd WndProc (bericht);

als Bericht. Msg = HookCommon. MouseHookMessage vervolgens

beginnen

// implementatie gevonden in de begeleidende code

 Signaal (TMouseDirection (bericht. LParam));

einde;

einde;

Natuurlijk, wanneer het formulier is gemaakt (OnCreate), roept u de HookMouse-procedure aan vanuit de DLL, wanneer het wordt gesloten (OnDestroy), roept u de UnHookMouse-procedure aan.

Opmerking: Hooks hebben de neiging het systeem te vertragen omdat ze de hoeveelheid verwerking die het systeem voor elk bericht moet uitvoeren, vergroten. Installeer een haak alleen wanneer dat nodig is en verwijder deze zo snel mogelijk.

instagram story viewer