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).
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.