Naučte se, jak sledovat aktivitu myši, i když vaše aplikace Delphi není aktivní zásobník nebo ano nemají žádné uživatelské rozhraní vůbec.
Instalací háčku myši pro celý systém (nebo globálního) můžete sledovat, co uživatel dělá s myš a podle toho jednat.
Co je hák a jak to funguje?
Zkrátka, háček je (zpětné volání) můžete vytvořit jako součást knihovny DLL (knihovna dynamických odkazů) nebo vaši aplikaci pro sledování „dění“ v operačním systému Windows.
Existují 2 typy háčků - globální a místní. Místní háček sleduje věci, které se dějí pouze pro konkrétní program (nebo vlákno). Globální háček monitoruje celý systém (všechna vlákna).
Chcete-li vytvořit globální zavěšení, potřebujete 2 projekty, 1 pro vytvoření spustitelného souboru a 1 pro vytvoření DLL obsahující proceduru zavěšení.
Náš článek o práce s klávesovými háčky od Delphi vysvětluje, jak zachytit vstup z klávesnice pro ovládací prvky, které nemohou přijímat vstupní fokus (například TImage).
Zapojení myši
Podle návrhu je pohyb myši omezen velikostí obrazovky na ploše (včetně hlavního panelu Windows). Když pohybujete myší k levému / pravému / hornímu / spodnímu okraji, myš se „zastaví“ - podle očekávání (pokud nemáte více než jeden monitor).
Tady je nápad pro systémový háček myši na celý systém: Pokud například chcete přesunout myš na pravou stranu obrazovky když se pohybuje směrem k levému okraji (a „se ho dotkne“), můžete napsat globální háček myši a přemístit myš ukazatel.
Začnete vytvořením projektu knihovny dynamických odkazů. DLL by měla exportovat dvě metody: "HookMouse" a "UnHookMouse".
Postup HookMouse volá SetWindowsHookEx API předávající "WH_MOUSE" pro první parametr - tedy instalaci procedury zavěšení, která monitoruje zprávy myši. Jedním z parametrů SetWindowsHookEx je funkce zpětného volání, které bude systém Windows volat, když bude zpracována zpráva myši:
SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);
Poslední parametr (hodnota = 0) v SetWindowsHookEx definuje, že registrujeme globální háček.
HookProc analyzuje zprávy související s myší a odešle vlastní zprávu („MouseHookMessage“) do našeho testovacího projektu:
funkce HookProc (nCode: Integer; celé číslo; MsgID: WParam; Data: LParam): LResult; stdcall;
var
mousePoint: TPoint;
notifyTestForm: boolean;
MouseDirection: TMouseDirection;
začít
mousePoint: = PMouseHookStruct (Data) ^. pt;
notifyTestForm: = false;
-li (mousePoint. X = 0) pak
začít
Okna. SetCursorPos (-2 + obrazovka. Width, mousePoint.y);
notifyTestForm: = true;
MouseDirection: = mdRight;
konec;
...
-li notifyTestForm pak
začít
PostMessage (FindWindow ('TMainHookTestForm', nula), MouseHookMessage, MsgID, Integer (MouseDirection));
konec;
Výsledek: = CallNextHookEx (Hook, nCode, MsgID, Data);
konec;
Spropitné: Přečtěte si soubory nápovědy Win32 SDK a zjistěte více o záznamu PMouseHookStruct a podpisu funkce HookProc.
Poznámka: Funkce zavěšení nemusí nic posílat nikde - volání PostMessage se používá pouze k označení toho, že DLL může komunikovat s „vnějším“ světem.
Mouse Hook "Listener"
Zpráva „MouseHookMessage“ je zaúčtována do vašeho testovacího projektu - formulář s názvem „TMainHookTestForm“. Přepíšete metodu WndProc, abyste dostali zprávu a jednali podle potřeby:
postup TMainHookTestForm. WndProc (var Zpráva: TMessage);
začít
zdědil WndProc (Zpráva);
-li Zpráva. Msg = HookCommon. MouseHookMessage pak
začít
// implementace nalezena v průvodním kódu
Signál (TMouseDirection (Zpráva). LParam));
konec;
konec;
Samozřejmě, když je formulář vytvořen (OnCreate), voláte proceduru HookMouse z DLL, když se uzavře (OnDestroy), voláte proceduru UnHookMouse.
Poznámka: Háčky mají tendenci zpomalit systém, protože zvyšují množství zpracování, které musí systém provést pro každou zprávu. Háček byste měli nainstalovat pouze v případě potřeby a co nejdříve jej odstranit.