A mers clasa Delphi cu codul sursă

Codul transmis de Jens Borrisholt. Text de Zarko Gajic.

De Jens: Hooks, am văzut o mulțime de oameni care încearcă să creeze o soluție curată pentru conectarea mesajelor într-o aplicație. Așa că am decis cu ceva timp în urmă să implementez cârlige ca o clasă, cu evenimente și lucruri frumoase :)

Hook.pas face posibilă atribuirea unui pointer de metodă unui indicator de procedură (cu ceva ajutor din partea asamblatorului).

De exemplu: dacă doriți să capturați TOATE loviturile de taste din aplicația dvs. - declarați pur și simplu o instanță a TKeyboardHook, alocați un handler de evenimente pentru OnPreExecute sau OnPostExecute, sau pentru ambele. Setați-vă KeyboadHook activ (KeyboardHook.Active: = True) și sunteți în funcțiune ...

Pe Windows Hooks

Un cârlig este un punct din mecanismul de gestionare a mesajelor de sistem în care o aplicație poate instala o subrutină pentru a monitoriza traficul de mesaje în sistem și a procesa anumite tipuri de mesaje înainte de a ajunge la procedura ferestrei țintă..

În scurt timp, un cârlig este o funcție pe care o puteți crea ca parte a unui dll sau a unei aplicații pentru a monitoriza „funcționarea” în sistemul de operare Windows.

Ideea este să scrieți o funcție care se numește de fiecare dată când are loc un anumit eveniment în Windows - de exemplu, atunci când un utilizator apasă o tastă pe tastatură sau mișcă mouse-ul.

Pentru o introducere mai detaliată a cârligelor, aruncați o privire la ce sunt cârligele Windows și cum să le utilizați într-o aplicație Delphi.

Mecanismul de cârlig se bazează pe mesajele Windows și funcțiile de returnare.

Tipuri de cârlige

De exemplu:
Puteți utiliza cârligul WH_KEYBOARD pentru a monitoriza introducerea tastaturii postate la o coadă de mesaje;
Puteți utiliza cârligul WH_MOUSE pentru a monitoriza introducerea mouse-ului postată la o coadă de mesaje;
Puteți proceda de cârlig WH_SHELL când aplicația shell este pe punctul de a fi activată și când o fereastră de nivel superior este creată sau distrusă.

Hooks.pas

  • TCBTHook - apelat înainte de a activa, crea, distruge, minimiza, maximiza, muta sau dimensiona o fereastră; înainte de a completa o comandă de sistem; înainte de a elimina un eveniment de mouse sau tastatură din coada de mesaje de sistem; înainte de a seta focalizarea de intrare; sau înainte de sincronizarea cu coada de mesaje a sistemului.
  • TDebugHook - apelat înainte de a apela procedurile de cârlig asociate cu orice alt cârlig din sistem
  • TGetMessageHook - permite unei aplicații să monitorizeze mesajele care urmează să fie returnate de funcția GetMessage sau PeekMessage
  • TJournalPlaybackHook - permite unei aplicații să insereze mesaje în coada de mesaje de sistem.
  • TJournalRecordHook - vă permite să monitorizați și să înregistrați evenimente de intrare (pentru a înregistra o secvență de evenimente de mouse și tastatură pentru a fi redate ulterior, utilizând Hook WH_JOURNALPLAYBACK).
  • TKeyboardHook - permite unei aplicații să monitorizeze traficul de mesaje pentru mesajele WM_KEYDOWN și WM_KEYUP.
  • TMouseHook - vă permite să monitorizați mesajele mouse-ului care urmează să fie returnate prin funcția GetMessage sau PeekMessage.
  • TLowLevelKeyboardHook - vă permite să monitorizați evenimentele de introducere a tastaturii care urmează să fie postate într-o coadă de introducere a firului.
  • TLowLevelMouseHook - vă permite să monitorizați evenimentele de introducere a mouse-ului care urmează să fie postate într-o coadă de introducere a firului.

Exemplu TKeyboardHook

Descărcați hooks.pas + aplicație demo

 folosește cârlige, ...
var
  KeyboardHook: TKeyboardHook;
...
// MainForm's OnCreate Handlerprocedure eveniment TMainForm.FormCreate (Expeditor: TObject);
începe
  KeyboardHook: = TKeyboardHook.Create;
  KeyboardHook.OnPreExecute: = KeyboardHookPREExecute;
  KeyboardHook.Active: = True;
Sfârșit;
// mânuie OnPREExecuteprocedure KeyboardHook TMainForm.KeyboardHookPREExecute (Hook: THook; var Hookmsg: THookMsg);
var
  Cheie: Cuvânt;
începe
  // Aici puteți alege dacă doriți să întoarceți // cursa tastei în aplicație sau nu
  Hookmsg.Result: = IfThen (cbEatKeyStrokes.Checked, 1, 0);
  Cheie: = Hookmsg.WPARAM;
  Subtitrare: = Char (cheie);
Sfârșit;

Gata, setat, cârlig :)