Haak de muis om gebeurtenissen buiten een toepassing te vangen

Leer hoe u de muisactiviteit kunt volgen, zelfs wanneer uw Delphi-toepassing niet actief is, in de lade zit of helemaal geen gebruikersinterface heeft.

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

Wat is een haak en hoe werkt het??

Kort gezegd is een hook een (callback) functie die u kunt maken als onderdeel van een DLL (Dynamic Link Library) of uw toepassing om het 'reilen en zeilen' in het Windows-besturingssysteem te volgen.
Er zijn 2 soorten haken - globaal en lokaal. Een lokale hook controleert dingen die alleen gebeuren voor een specifiek programma (of thread). Een globale haak bewaakt het hele systeem (alle threads).

Om een ​​globale hook te maken, hebt u 2 projecten nodig, 1 om het uitvoerbare bestand te maken en 1 om een ​​DLL te maken met de hook-procedure.

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

De muis vasthaken

Door het ontwerp wordt de beweging van de muis beperkt door de grootte van uw bureaubladscherm (inclusief de Windows-taakbalk). Wanneer u de muis naar links / rechts / boven / onder beweegt, "stopt" de muis - zoals verwacht (als u niet meer dan één monitor hebt).

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

U begint met het maken van een dynamisch linkbibliotheekproject. De DLL moet twee methoden exporteren: "HookMouse" en "UnHookMouse".

De HookMouse-procedure roept de SetWindowsHookEx API geeft de "WH_MOUSE" door voor de eerste parameter - waardoor een hook-procedure wordt geïnstalleerd die muisberichten controleert. Een van de parameters voor SetWindowsHookEx is uw callback-functie die Windows zal aanroepen wanneer er een muisbericht moet worden verwerkt:

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

De laatste parameter (waarde = 0) in 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; Data: LParam): LResult; stdcall;

var

    mousePoint: TPoint;

    kennisTestForm: boolean;

    MouseDirection: TMouseDirection;

 beginnen

    mousePoint: = PMouseHookStruct (Data) ^. pt;

 

    kennisTestForm: = false;

 

    als (mousePoint.X = 0) vervolgens

    beginnen

      Windows.SetCursorPos (-2 + Screen.Width, mousePoint.y);

      kennisTestForm: = true;

      MouseDirection: = mdRight;

    einde;

...
  
als notifyTestForm 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 voor meer informatie over het PMouseHookStruct-record en de handtekening van de HookProc-functie.

Notitie: Een hook-functie hoeft nergens iets naartoe te sturen - de PostMessage-oproep wordt alleen gebruikt om aan te geven dat de DLL kan communiceren met de "buiten" wereld.

Muishaak "luisteraar"

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

 procedure TMainHookTestForm.WndProc (var Bericht: TMessage);

beginnen

    geërfd WndProc (bericht);

  
als Message.Msg = HookCommon.MouseHookMessage vervolgens

    beginnen

      // implementatie gevonden in de bijbehorende code

      Signaal (TMouseDirection (Message.LParam));

    einde;

einde;

Wanneer u het formulier maakt (OnCreate), roept u natuurlijk de HookMouse-procedure op vanuit de DLL, en wanneer het wordt gesloten (OnDestroy), roept u de UnHookMouse-procedure op.

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