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 și atunci când aplicația dvs. Delphi nu este activă, se află în tavă sau nu are niciun UI..

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

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

Pe scurt, un cârlig este o funcție (callback) pe care o puteți crea ca parte a unei DLL (biblioteca de legături dinamice) sau a aplicației dvs. pentru a monitoriza „activările” 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 lucrul 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).

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 „atinge”), puteți scrie un cârlig global pentru mouse pentru a repoziționa indicatorul mouse-ului.

Î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 + Screen.Width, 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 înlocui 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ă Message.Msg = HookCommon.MouseHookMessage apoi

    începe

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

      Semnal (TMouseDirection (Message.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.