Az egér állapotáról szeretnénk információkat gyűjteni, függetlenül attól, hogy melyik program az aktív. Ennek a problémának a megoldásához az úgynevezett Hook technikát alkalmazzuk.
A SetWindowsHookEx függvény segítségével elvégezzük a regisztrációt a rendszerben.
Hook:=SetWindowsHookEx(WH_JOURNALRECORD,@HookProc,hInstance,0);
Az első paraméterben megadott WH_JOURNALRECORD azt jelenti, hogy a rendszer által létrehozott üzeneteket akarjuk kezelni. A második paraméterben egy callback függvény nevét kell megadnunk. Ez a függvény végzi el az üzenetek feldolgozását.
Visszatérési értékként egy HHook típusú változóban kapjuk meg a létrehozott Hook azonosítóját.
Az üzenetek feldolgozását a HookProc eljárás végzi.
function HookProc(Code,wParam: Integer; var lParam: TEventMsg): Integer; stdcall;
Függvényünk elején meghívjuk a CallNextHookEx Windows függvényt, mely aktivizálja az esetlegesen más alkalmazások által hasonló módon igényelt Hook szolgáltatást.
Az egér üzeneteit külön kell bontanunk, hogy naplózni tudjuk az eseményeket. A HookProc függvény lParam paraméteréből meghatározhatjuk, hogy milyen egér esemény történt.
if lParam.message=WM_LBUTTONDOWN then
s:='Bal gomb lenyomva: '+IntToStr(lParam.paramL)+','+IntToStr(lParam.paramH);
A struktúra message tagja megadja az esemény típusát. A paramL és paramH tagokból kiolvashatjuk az egér koordinátáit.
A program bezárásakor törölnünk kell a rendszerből a regisztrált Hook-ot. Ezt az UnhookWindowsHookEx függvény felhasználásával tehetjük meg.
UnhookWindowsHookEx(Hook);