Lær hvordan du sporer museaktiviteten, selv når din Delphi-applikation ikke er aktiv, sidder i bakke eller gør ikke har nogen brugergrænseflade overhovedet.
Ved at installere en systemdækkende (eller global) musekrog kan du overvåge, hvad brugeren laver med mus og handle i overensstemmelse hermed.
Hvad er en krok, og hvordan fungerer det?
Kort sagt, en krog er en (ring tilbage) -funktion, du kan oprette som en del af en DLL (dynamisk link bibliotek) eller din ansøgning om at overvåge 'forløbet' inde i Windows-operativsystemet.
Der er 2 typer kroge - global og lokal. En lokal krog overvåger ting, der kun sker for et specifikt program (eller tråd). En global krog overvåger hele systemet (alle tråde).
For at oprette en global hook kræver du 2 projekter, 1 for at fremstille den eksekverbare fil og 1 for at lave en DLL indeholdende hook-proceduren.
Vores artikel om arbejder med tastaturkrog fra Delphi forklarer, hvordan man opfanger tastaturindgangen til kontroller, der ikke kan modtage inputfokus (som TImage).
Tilslut musen
Ved design er musens bevægelse begrænset af størrelsen på din skrivebordsskærm (inklusive Windows-proceslinjen). Når du flytter musen til venstre / højre / øverste / nederste kant, stopper musen - som forventet (hvis du ikke har mere end én skærm).
Her er en idé til den systembrede musekrog: Hvis du for eksempel vil flytte musen til højre side af skærmen når den bevæger sig mod venstre kant (og "berører" den), skriver du måske en global musekrog for at flytte musen tilbage pointer.
Du starter med at oprette et dynamisk linkbiblioteksprojekt. DLL skal eksportere to metoder: "HookMouse" og "UnHookMouse".
HookMouse-proceduren kalder SetWindowsHookEx API videregiver "WH_MOUSE" for den første parameter - og installer således en hook-procedure, der overvåger musebeskeder. En af parametrene til SetWindowsHookEx er din tilbagekaldsfunktion Windows ringer til, når der er en musemeddelelse, der skal behandles:
SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);
Den sidste parameter (værdi = 0) i SetWindowsHookEx definerer, at vi registrerer en global krog.
HookProc analyserer de muserelaterede meddelelser og sender en brugerdefineret besked ("MouseHookMessage") til vores testprojekt:
fungere HookProc (nCode: Heltal; MsgID: WParam; Data: LParam): LResult; stdcall;
Var
mousePoint: TPoint;
notifyTestForm: boolean;
MouseDirection: TMouseDirection;
begynde
mousePoint: = PMouseHookStruct (Data) ^. pt;
notifyTestForm: = falsk;
hvis (MousePoint. X = 0) derefter
begynde
Windows. SetCursorPos (-2 + skærm. Bredde, mousePoint.y);
notifyTestForm: = sandt;
MouseDirection: = mdRight;
ende;
...
hvis notifyTestForm derefter
begynde
PostMessage (FindWindow ('TMainHookTestForm', nul), MouseHookMessage, MsgID, Integer (MouseDirection));
ende;
Resultat: = CallNextHookEx (Hook, nCode, MsgID, Data);
ende;
Tip: Læs Win32 SDK Hjælp-filer for at finde ud af om PMouseHookStruct-posten og signaturen til HookProc-funktionen.
Bemærk: En krogfunktion behøver ikke at sende noget overalt - PostMessage-opkaldet bruges kun til at indikere, at DLL kan kommunikere med den "ydre" verden.
Musekrog "lytter"
Meddelelsen "MouseHookMessage" sendes til dit testprojekt - en formular med navnet "TMainHookTestForm". Du tilsidesætter WndProc-metoden for at få meddelelsen og handle efter behov:
procedure TMainHookTestForm. WndProc (Var Meddelelse: TMessage);
begynde
arvet WndProc (besked);
hvis Besked. Msg = HookCommon. MouseHookMessage derefter
begynde
// implementering findes i den ledsagende kode
Signal (TMouseDirection (besked. LParam));
ende;
ende;
Når formularen oprettes (OnCreate), ringer du naturligvis HookMouse-proceduren fra DLL, når den lukkes (OnDestroy), kalder du UnHookMouse-proceduren.
Bemærk: Kroge har en tendens til at bremse systemet, fordi de øger mængden af behandling, som systemet skal udføre for hver meddelelse. Du skal kun installere en krog, når det er nødvendigt, og fjerne det så hurtigt som muligt.