Priključite miško, da lovi dogodke zunaj aplikacije

click fraud protection

Naučite se, kako slediti aktivnosti miške, tudi če vaša aplikacija Delphi ni aktivna, sedi v pladenj ali ne nimajo uporabniškega vmesnika nasploh.

Z namestitvijo sistemske (ali globalne) kljuke miške lahko spremljate, kaj uporabnik počne z miška in ustrezno ravnati.

Kaj je kavelj in kako deluje?

Skratka, kavelj je (poklicati nazaj) funkcijo, ki jo lahko ustvarite kot del DLL (knjižnica dinamičnih povezav) ali vašo aplikacijo za nadziranje dogajanj v operacijskem sistemu Windows.
Obstajata dve vrsti kavljev - globalna in lokalna. Lokalni kavelj spremlja stvari, ki se dogajajo samo za določen program (ali nit). Globalni kavelj spremlja celoten sistem (vse niti).

Če želite ustvariti globalni kavelj, potrebujete 2 projekta, 1 za izdelavo izvršljive datoteke in 1 za izdelavo DLL, ki vsebuje postopek kavljenja.

Naš članek o delo s kljukicami tipkovnice podjetja Delphi razlaga, kako prestreči vhod tipkovnice za kontrole, ki ne morejo sprejeti vhodnega ostrenja (npr. TImage).

Prikleni miško

Po načrtih je gibanje miške omejeno z velikostjo zaslona namizja (vključno z opravilno vrstico Windows). Ko miško premaknete na levi / desni / zgornji / spodnji rob, se bo miška "ustavila" - kot je bilo pričakovano (če nimate več enega monitorja).

instagram viewer

Tu je ideja za sistemsko kljuko na miški: če želite na primer premakniti miško na desno stran zaslona ko se premakne proti levemu robu (in se ga "dotakne"), lahko napišete globalni kavelj za miško, da postavite miško kazalec.

Začnete z ustvarjanjem projekta knjižnice dinamičnih povezav. DLL mora izvoziti dve metodi: "HookMouse" in "UnHookMouse".

Postopek HookMouse pokliče SetWindowsHookEx API za prvi parameter prenese "WH_MOUSE" - torej namesti postopek kljuke, ki spremlja mišja sporočila. Eden od parametrov za SetWindowsHookEx je funkcija povratnega klica, ki jo bo Windows poklical, ko bo mišje sporočilo obdelalo:

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

Zadnji parameter (vrednost = 0) v SetWindowsHookEx določa, da beležimo globalni kavelj.

HookProc razčisti sporočila, povezana z miško, in pošlje sporočilo po meri ("MouseHookMessage") našem testnemu projektu:

funkcijo HookProc (nCode: Integer; MsgID: WParam; Podatki: LParam): LResult; stdcall;

var

 mousePoint: TPoint;

 notifyTestForm: boolean;

 MouseDirection: TMouseDirection;

začeti

 mousePoint: = PMouseHookStruct (podatki) ^. pt;


 notifyTestForm: = napačno;


če (miška točka. X = 0) torej

začeti

 Windows. SetCursorPos (zaslon -2 +). Širina, mousePoint.y);

 notifyTestForm: = res;

 MouseDirection: = mdRight;

konec;

...
če notifyTestForm torej

začeti

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

konec;

Rezultat: = CallNextHookEx (kavelj, nCode, MsgID, podatki);
konec;

Namig: Preberite datoteke Win32 SDK Help, če želite izvedeti več o zapisu PMouseHookStruct in podpisu funkcije HookProc.

Opomba: Funkciji kavelj ni treba nikamor pošiljati - klic PostMessage se uporablja samo za označevanje, da lahko DLL komunicira z "zunanjim" svetom.

Kavelj za miško "Poslušalec"

Sporočilo "MouseHookMessage" je objavljeno v preizkusnem projektu - obrazec z imenom "TMainHookTestForm". Prepovedali boste metodo WndProc, da boste dobili sporočilo in ukrepali po potrebi:

postopek TMainHookTestForm. WndProc (var Sporočilo: TMessage);

začeti

podedovano WndProc (sporočilo);

če Sporočilo. Msg = HookCommon. MouseHookMessage torej

začeti

// izvedba, ki jo najdemo v spremljajoči kodi

 Signal (TMouseDirection (sporočilo). LParam));

konec;

konec;

Ko ustvarite obrazec (OnCreate), pokličete postopek HookMouse iz DLL, ko se zapre (OnDestroy), pokličete postopek UnHookMouse.

Opomba: Kljuke ponavadi upočasnijo sistem, ker povečajo količino obdelave, ki jo mora sistem opraviti za vsako sporočilo. Kavelj namestite samo po potrebi in ga čim prej odstranite.

instagram story viewer