Zakačite miša da biste ulovili događaje izvan aplikacije

Saznajte kako pratiti aktivnosti miša čak i kad vaša aplikacija Delphi nije aktivna, sjedi u aplikaciji ladica ili čini nemaju nikakvo korisničko sučelje uopće.

Instaliranjem kuke miša cijelog sustava (ili globalne) možete pratiti što korisnik radi s miš i prema tome postupati.

Što je kuka i kako djeluje?

Ukratko, kuka je (uzvratiti poziv) funkciju koju možete stvoriti kao dio DLL-a (knjižnica dinamičnih veza) ili vašu aplikaciju za nadziranje događaja u Windows operativnom sustavu.
Postoje dvije vrste kuka - globalna i lokalna. Lokalna udica nadgleda događaje samo za određeni program (ili nit). Globalna kuka nadgleda cijeli sustav (sve niti).

Za stvaranje globalne udice potrebna su vam 2 projekta, 1 za izradu izvršne datoteke i 1 za napraviti DLL koji sadrži postupak udice.

Naš članak o rad sa Delfhi kukama na tipkovnici objašnjava kako presresti ulaz tipkovnice za kontrole koje ne mogu primiti fokus ulaza (poput TImage).

Kukajući miša

Po dizajnu je kretanje miša ograničeno veličinom zaslona radne površine (uključujući Windows traku sa zadacima). Kad pomaknete miš lijevo / desno / gornji / donji rub, miš će se "zaustaviti" - kako je i očekivano (ako nemate više od jednog monitora).

instagram viewer

Evo ideje za kuku miša u cijelom sustavu: Ako, na primjer, želite pomaknuti miš na desnu stranu zaslona kada se pomakne prema lijevom rubu (i "dodirne ga"), možete napisati globalnu kuku miša kako biste promijenili položaj miša pokazivač.

Započinjete izradom projekta biblioteke dinamičnih veza. DLL bi trebao izvesti dvije metode: "HookMouse" i "UnHookMouse".

Procedura HookMouse poziva na SetWindowsHookEx API prolazi "WH_MOUSE" za prvi parametar - na taj način instalira postupak kuke koji nadzire poruke miša. Jedan od parametara SetWindowsHookEx je funkcija povratnog poziva koju će Windows nazvati kada postoji poruka miša koja se obrađuje:

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

Posljednji parametar (vrijednost = 0) u SetWindowsHookEx definira da registriramo globalnu udicu.

HookProc analizira poruke povezane s mišem i šalje prilagođenu poruku ("MouseHookMessage") našem testnom projektu:

funkcija HookProc (nCode: Integer; MsgID: WParam; Podaci: LParam): LResult; stdcall;

var

 mousePoint: TPoint;

 notifyTestForm: boolean;

 MouseDirection: TMouseDirection;

početi

 mousePoint: = PMouseHookStruct (podaci) ^. pt;


 notifyTestForm: = netočno;


ako (MousePoint. X = 0) zatim

početi

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

 notifyTestForm: = istina;

 MouseDirection: = mdRight;

kraj;

...
ako notifyTestForm zatim

početi

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

kraj;

Rezultat: = CallNextHookEx (Kuka, nCode, MsgID, Podaci);
kraj;

Savjet: Pročitajte Win32 SDK datoteke pomoći kako biste saznali više o PMouseHookStruct zapisu i potpisu funkcije HookProc.

Bilješka: Značajka udice ne mora ništa slati bilo gdje - PostMessage poziv koristi se samo za naznaku da DLL može komunicirati s "vanjskim" svijetom.

Kuka za miša "Slušalac"

Poruka "MouseHookMessage" objavljena je na vašem testnom projektu - obrascu pod nazivom "TMainHookTestForm". Nadjačit ćete WndProc metodu kako biste dobili poruku i djelovali prema potrebi:

postupak TMainHookTestForm. WndProc (var Poruka: TMessage);

početi

naslijedio WndProc (poruka);

ako Poruka. Msg = KukaCommon. MouseHookMessage zatim

početi

// implementacija pronađena u priloženom kodu

 Signal (TMouseDirection (poruka). LParam));

kraj;

kraj;

Naravno, kad se obrazac stvori (OnCreate), vi zovete postupak HookMouse iz DLL-a, a kada se on zatvori (OnDestroy), vi zovete postupak UnHookMouse.

Napomena: Kuke obično usporavaju sustav jer povećavaju količinu obrade koju sustav mora obaviti za svaku poruku. Kuku biste trebali instalirati samo kad je to potrebno i uklonite je što je prije moguće.