Hekt musen for å fange hendelser utenfor et program

click fraud protection

Lær hvordan du sporer museaktiviteten selv når Delphi-applikasjonen ikke er aktiv, sitter i brett eller gjør det ikke har noe brukergrensesnitt i det hele tatt.

Ved å installere en systemomfattende (eller global) musekrok kan du overvåke hva brukeren gjør med mus og handle deretter.

Hva er en krok, og hvordan fungerer det?

Kort sagt, en krok er en (Ring tilbake) -funksjon du kan opprette som en del av en DLL (dynamisk lenke bibliotek) eller applikasjonen din for å overvåke 'skjer' i Windows-operativsystemet.
Det er to typer kroker - globale og lokale. En lokal krok overvåker ting som bare skjer for et bestemt program (eller tråd). En global krok overvåker hele systemet (alle tråder).

For å lage en global hook trenger du 2 prosjekter, 1 for å lage den kjørbare filen og 1 for å lage en DLL som inneholder hook-prosedyren.

Vår artikkel om jobber med tastaturkroker fra Delphi forklarer hvordan du kan avskjære tastaturinngangen for kontroller som ikke kan motta inngangsfokus (som TImage).

Hooking the Mouse

instagram viewer

Ved design er musens bevegelse begrenset av størrelsen på skrivebordets skjerm (inkludert Windows oppgavelinje). Når du beveger musen til venstre / høyre / øvre / nedre kant, vil musen "stoppe" - som forventet (hvis du ikke har mer enn én skjerm).

Her er en ide for den hele systemet musekroken: Hvis du for eksempel vil flytte musen til høyre side av skjermen når den beveger seg mot venstre kant (og "berører" den), kan du skrive en global musekrok for å plassere musen på nytt pekeren.

Du starter med å lage et dynamisk linkbibliotekprosjekt. DLL skal eksportere to metoder: "HookMouse" og "UnHookMouse".

HookMouse-prosedyren kaller SetWindowsHookEx API passerer "WH_MOUSE" for den første parameteren - og installerer dermed en krokprosedyre som overvåker musemeldinger. En av parameterne til SetWindowsHookEx er tilbakeringingsfunksjonen Windows vil ringe når det er en musemelding som skal behandles:

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

Den siste parameteren (verdi = 0) i SetWindowsHookEx definerer at vi registrerer en global krok.

HookProc analyserer muserelaterte meldinger og sender en tilpasset melding ("MouseHookMessage") til testprosjektet vårt:

funksjon HookProc (nKode: Heltall; MsgID: WParam; Data: LParam): LResult; STDCALL;

Var

 mousePoint: TPoint;

 notifyTestForm: boolean;

 MouseDirection: TMouseDirection;

begynne

 mousePoint: = PMouseHookStruct (Data) ^. pt;


 notifyTestForm: = falsk;


hvis (MousePoint. X = 0) deretter

begynne

 Windows. SetCursorPos (-2 + skjerm. Bredde, mousePoint.y);

 notifyTestForm: = true;

 MouseDirection: = mdRight;

slutt;

...
hvis notifyTestForm deretter

begynne

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

slutt;

Resultat: = CallNextHookEx (Hook, nCode, MsgID, Data);
slutt;

Tips: Les Win32 SDK Hjelp-filer for å finne ut om PMouseHookStruct-posten og signaturen til HookProc-funksjonen.

Merk: En krokfunksjon trenger ikke å sende noe hvor som helst - PostMessage-samtalen brukes bare for å indikere at DLL kan kommunisere med den "ytre" verden.

Musekrok "lytter"

Meldingen "MouseHookMessage" legges ut i testprosjektet ditt - et skjema som heter "TMainHookTestForm". Du overstyrer WndProc-metoden for å få meldingen og handle etter behov:

fremgangsmåte TMainHookTestForm. WndProc (Var Melding: TMessage);

begynne

arvet WndProc (melding);

hvis Beskjed. Msg = HookCommon. MouseHookMessage deretter

begynne

// implementering funnet i den tilhørende koden

 Signal (TMouseDirection (melding. LParam));

slutt;

slutt;

Når skjemaet opprettes (OnCreate), kaller du selvfølgelig HookMouse-prosedyren fra DLL, når det blir lukket (OnDestroy), kaller du UnHookMouse-prosedyren.

Merk: Kroker har en tendens til å bremse systemet fordi de øker behandlingsmengden systemet må utføre for hver melding. Du bør installere en krok bare når det er nødvendig, og fjerne den så snart som mulig.

instagram story viewer