Naučte sa, ako sledovať aktivitu myši, aj keď vaša aplikácia Delphi nie je aktívna, je umiestnená v podnos alebo robí nemajú žiadne používateľské rozhranie vôbec.
Inštaláciou háčika myši pre celý systém (alebo globálneho) môžete monitorovať, čo používateľ robí s myš a konať podľa toho.
Čo je to hák a ako to funguje?
Stručne povedané, háčik je (zavolaj späť), ktorú môžete vytvoriť ako súčasť knižnice DLL (knižnica dynamických odkazov) alebo vo vašej aplikácii na sledovanie „diania“ vo vnútri operačného systému Windows.
Existujú 2 typy háčikov - globálne a miestne. Miestny hák monitoruje veci, ktoré sa dejú iba pre konkrétny program (alebo vlákno). Globálny hák monitoruje celý systém (všetky vlákna).
Ak chcete vytvoriť globálny hák, potrebujete 2 projekty, 1 na vytvorenie spustiteľného súboru a 1 na vytvorenie DLL obsahujúceho procedúru hook.
Náš článok o práca s klávesovými háčikmi od spoločnosti Delphi vysvetľuje, ako zachytiť vstup z klávesnice pre ovládacie prvky, ktoré nemôžu získať vstupné zameranie (napríklad TImage).
Zapojenie myši
Podľa návrhu je pohyb myši obmedzený veľkosťou obrazovky na obrazovke (vrátane panela úloh systému Windows). Keď pohnete myšou na ľavý, pravý, horný alebo dolný okraj, myš sa „zastaví“ - podľa očakávania (ak nemáte viac ako jeden monitor).
Tu je nápad pre systémový hák na myš: Ak chcete napríklad presunúť myš na pravú stranu obrazovky keď sa posunie smerom k ľavému okraju (a „sa ho dotkne“), môžete napísať globálny háčik myši na premiestnenie myši ukazovateľ.
Začnete vytvorením projektu dynamickej knižnice odkazov. DLL by mala exportovať dve metódy: „HookMouse“ a „UnHookMouse“.
Postup HookMouse volá SetWindowsHookEx Rozhranie API odovzdávajúce "WH_MOUSE" pre prvý parameter - inštaluje tak procedúru pripojenia, ktorá monitoruje správy myši. Jedným z parametrov SetWindowsHookEx je funkcia spätného volania, ktorú systém Windows zavolá, keď sa spracuje správa myši:
SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);
Posledný parameter (hodnota = 0) v SetWindowsHookEx definuje, že registrujeme globálny háčik.
HookProc analyzuje správy súvisiace s myšou a do nášho testovacieho projektu pošle vlastnú správu („MouseHookMessage“):
funkcie HookProc (nCode: Celé číslo; MsgID: WParam; Údaje: LParam): LResult; STDCALL;
var
mousePoint: TPoint;
notifyTestForm: boolean;
MouseDirection: TMouseDirection;
začať
mousePoint: = PMouseHookStruct (Data) ^. pt;
notifyTestForm: = false;
ak (MousePoint. X = 0) potom
začať
Windows. SetCursorPos (-2 + obrazovka. Width, mousePoint.y);
notifyTestForm: = true;
MouseDirection: = mdRight;
koniec;
...
ak notifyTestForm potom
začať
PostMessage (FindWindow ('TMainHookTestForm', nula), MouseHookMessage, MsgID, celé číslo (MouseDirection));
koniec;
Výsledok: = CallNextHookEx (Hook, nCode, MsgID, Data);
koniec;
Tip: Prečítajte si súbory pomocníka Win32 SDK, aby ste sa dozvedeli viac o zázname PMouseHookStruct a podpise funkcie HookProc.
Poznámka: Funkcia zavesenia nemusí nič poslať kamkoľvek - volanie PostMessage sa používa iba na označenie toho, že DLL môže komunikovať s „vonkajším“ svetom.
Myš Hook "Listener"
Správa „MouseHookMessage“ sa uverejní vo vašom testovacom projekte - formulár s názvom „TMainHookTestForm“. Prepíšete metódu WndProc, aby ste dostali správu a postupovali podľa potreby:
procedúra TMainHookTestForm. WndProc (var Správa: TMessage);
začať
zdedený WndProc (správa);
ak Správa. Msg = HookCommon. MouseHookMessage potom
začať
// implementácia nájdená v sprievodnom kóde
Signal (TMouseDirection (Správa. LParam));
koniec;
koniec;
Po vytvorení formulára (OnCreate) samozrejme zavoláte procedúru HookMouse z DLL, keď sa zatvorí (OnDestroy), zavoláte procedúru UnHookMouse.
Poznámka: Háčiky majú tendenciu spomaľovať systém, pretože zvyšujú množstvo spracovania, ktoré musí systém vykonať pre každú správu. Háčik by ste mali nainštalovať iba v prípade potreby a čo najskôr ho odstrániť.