Agățați mouse-ul pentru a prinde evenimente din afara unei aplicații

Aflați cum să urmăriți activitatea mouse-ului chiar dacă aplicația dvs. Delphi nu este activă, se află în tavă sau face nu aveți niciun UI deloc.

Prin instalarea unui cârlig de mouse (sau global) pentru mouse, puteți monitoriza ceea ce utilizatorul face cu șoarece și acționează în consecință.

Ce este un cârlig și cum funcționează?

Pe scurt, un cârlig este un (suna inapoi) funcție pe care o puteți crea ca parte a unui DLL (biblioteca de legături dinamice) sau aplicația dvs. pentru a monitoriza „pornirile” din sistemul de operare Windows.
Există 2 tipuri de cârlige - globale și locale. Un cârlig local monitorizează lucrurile care se întâmplă doar pentru un anumit program (sau thread). Un cârlig global monitorizează întregul sistem (toate firele).

Pentru a crea un cârlig global aveți nevoie de 2 proiecte, 1 pentru a crea fișierul executabil și 1 pentru a crea un DLL care conține procedura de cârlig.

Articolul nostru despre care lucrează cu cârlige de la tastatură de la Delphi explică modul de interceptare a intrării tastaturii pentru controale care nu pot primi focalizarea de intrare (cum ar fi TImage).

instagram viewer

Agatând mouse-ul

Prin design, mișcarea mouse-ului este restricționată de dimensiunea ecranului desktop (inclusiv Bara de activități Windows). Când mutați mouse-ul pe marginea stângă / dreapta / sus / jos, mouse-ul se va „opri” - așa cum este de așteptat (dacă nu aveți mai mult de un singur monitor).

Iată o idee pentru cârligul mouse-ului la nivelul întregului sistem: Dacă de exemplu, doriți să mutați mouse-ul în partea dreaptă a ecranului atunci când se deplasează spre marginea stângă (și o „atinge”), s-ar putea să scrieți un cârlig global pentru a repoziționa mouse-ul pointer.

Începeți prin crearea unui proiect de bibliotecă de legături dinamice. DLL ar trebui să exporte două metode: „HookMouse” și „UnHookMouse”.

Procedura HookMouse apelează la SetWindowsHookEx API care trece „WH_MOUSE” pentru primul parametru - instalând astfel o procedură de cârlig care monitorizează mesajele mouse-ului. Unul dintre parametrii SetWindowsHookEx este funcția dvs. de apelare pe care Windows o va apela atunci când va fi procesat un mesaj de mouse:

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

Ultimul parametru (valoare = 0) din SetWindowsHookEx definește că înregistrăm un cârlig global.

HookProc analizează mesajele legate de mouse și trimite un mesaj personalizat („MouseHookMessage”) proiectului nostru de testare:

funcţie HookProc (nCode: Integer; MsgID: WParam; Date: LParam): LResult; stdcall;

var

 mousePoint: TPoint;

 notificationTestForm: boolean;

 MouseDirection: TMouseDirection;

începe

 mousePoint: = PMouseHookStruct (Date) ^. pt;


 notificationTestForm: = fals;


dacă (MousePoint. X = 0) apoi

începe

 Windows. SetCursorPos (-2 + Ecran. Lățime, mousePoint.y);

 notificationTestForm: = true;

 MouseDirection: = mdRight;

Sfârșit;

...
dacă notifyTestForm apoi

începe

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

Sfârșit;

Rezultat: = CallNextHookEx (Hook, nCode, MsgID, Data);
Sfârșit;

Bacsis: Citiți fișierele de ajutor Win32 SDK pentru a afla informațiile despre înregistrarea PMouseHookStruct și semnătura funcției HookProc.

Notă: O funcție de cârlig nu trebuie să trimită nimic nicăieri - apelul PostMessage este utilizat doar pentru a indica faptul că DLL poate comunica cu lumea „exterioară”.

Mouse Hook "Ascultător"

Mesajul „MouseHookMessage” este postat în proiectul dvs. de testare - un formular numit „TMainHookTestForm”. Veți trece peste metoda WndProc pentru a obține mesajul și pentru a acționa după cum este necesar

procedură TMainHookTestForm. WndProc (var Mesaj: TMessage);

începe

mostenit WndProc (Mesaj);

dacă Mesaj. Msg = HookCommon. MouseHookMessage apoi

începe

// implementarea găsită în codul însoțitor

 Semnal (TMouseDirection (Mesaj). LParam));

Sfârșit;

Sfârșit;

Desigur, când formularul este creat (OnCreate), apelați procedura HookMouse din DLL, când se închide (OnDestroy), apelați la procedura UnHookMouse.

Notă: Cârligele tind să încetinească sistemul, deoarece cresc cantitatea de procesare pe care sistemul trebuie să o efectueze pentru fiecare mesaj. Ar trebui să instalați un cârlig doar când este necesar și să îl scoateți cât mai curând posibil.