Zaczep mysz, aby wychwytywać zdarzenia poza aplikacją

Dowiedz się, jak śledzić aktywność myszy, nawet gdy aplikacja Delphi nie jest aktywna, siedzi w taca lub robi nie mieć żadnego interfejsu użytkownika w ogóle.

Instalując ogólnosystemowy (lub globalny) zaczep do myszy, możesz monitorować, co użytkownik robi z mysz i działaj odpowiednio.

Co to jest hak i jak działa?

Krótko mówiąc, hak to (oddzwonić) można utworzyć jako część biblioteki DLL (Biblioteka linków dynamicznych) lub Twojej aplikacji do monitorowania „kontynuacji” w systemie operacyjnym Windows.
Istnieją 2 rodzaje haków - globalne i lokalne. Lokalny haczyk monitoruje rzeczy dziejące się tylko dla określonego programu (lub wątku). Globalny haczyk monitoruje cały system (wszystkie wątki).

Aby utworzyć globalny hook, potrzebujesz 2 projektów, 1 do utworzenia pliku wykonywalnego i 1 do utworzenia biblioteki DLL zawierającej procedurę hook.

Nasz artykuł na temat praca z zaczepami na klawiaturę firmy Delphi wyjaśnia, jak przechwytywać dane z klawiatury dla elementów sterujących, które nie mogą otrzymać fokusu wejściowego (np. TImage).

instagram viewer

Hooking the Mouse

Z założenia ruch myszy jest ograniczony rozmiarem ekranu pulpitu (w tym paska zadań systemu Windows). Po przesunięciu myszy do lewej / prawej / górnej / dolnej krawędzi mysz „zatrzyma się” - zgodnie z oczekiwaniami (jeśli nie masz więcej niż jednego monitora).

Oto pomysł na systemowy haczyk na myszy: jeśli na przykład chcesz przesunąć mysz na prawą stronę ekranu kiedy przesuwa się w kierunku lewej krawędzi (i „dotyka” go), możesz napisać globalny zaczep myszy, aby zmienić położenie myszy wskaźnik.

Zaczynasz od utworzenia projektu biblioteki dołączanej dynamicznie. Biblioteka DLL powinna wyeksportować dwie metody: „HookMouse” i „UnHookMouse”.

Procedura HookMouse wywołuje metodę SetWindowsHookEx API przekazuje „WH_MOUSE” dla pierwszego parametru - instalując w ten sposób procedurę przechwytującą, która monitoruje komunikaty myszy. Jednym z parametrów SetWindowsHookEx jest funkcja zwrotna, którą Windows wywoła, gdy pojawi się komunikat myszy do przetworzenia:

SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);

Ostatni parametr (wartość = 0) w SetWindowsHookEx określa, że ​​rejestrujemy globalny hook.

HookProc analizuje wiadomości związane z myszą i wysyła wiadomość niestandardową („MouseHookMessage”) do naszego projektu testowego:

funkcjonować HookProc (nCode: Integer; MsgID: WParam; Dane: LParam): LResult; stdcall;

var

 mousePoint: TPoint;

 replaceTestForm: boolean;

 MouseDirection: TMouseDirection;

zaczynać

 mousePoint: = PMouseHookStruct (Data) ^. pt;


 replaceTestForm: = false;


gdyby (mousePoint. X = 0) następnie

zaczynać

 Windows SetCursorPos (-2 + ekran. Szerokość, mousePoint.y);

 replaceTestForm: = true;

 MouseDirection: = mdRight;

koniec;

...
gdyby powiadomienieTestForm następnie

zaczynać

 PostMessage (FindWindow („TMainHookTestForm”, zero), MouseHookMessage, MsgID, Integer (MouseDirection));

koniec;

Wynik: = CallNextHookEx (Hook, nCode, MsgID, Data);
koniec;

Wskazówka: Przeczytaj pliki pomocy zestawu SDK Win32, aby dowiedzieć się o rekordzie PMouseHookStruct i podpisie funkcji HookProc.

Uwaga: Funkcja przechwytująca nie musi nigdzie wysyłać niczego - wywołanie PostMessage służy jedynie do wskazania, że ​​biblioteka DLL może komunikować się ze „światem zewnętrznym”.

Hak do myszy „Listener”

Komunikat „MouseHookMessage” jest wysyłany do projektu testowego - formularz o nazwie „TMainHookTestForm”. Zastąpisz metodę WndProc, aby uzyskać komunikat i działać w razie potrzeby:

procedura TMainHookTestForm. WndProc (var Wiadomość: TMessage);

zaczynać

dziedziczny WndProc (Wiadomość);

gdyby Wiadomość. Msg = HookCommon. MouseHookMessage następnie

zaczynać

// implementacja znaleziona w dołączonym kodzie

 Sygnał (TMouseDirection (komunikat. LParam));

koniec;

koniec;

Oczywiście, kiedy formularz jest tworzony (OnCreate) wywołujesz procedurę HookMouse z biblioteki DLL, a kiedy się zamyka (OnDestroy) wywołujesz procedurę UnHookMouse.

Uwaga: Haki mają tendencję do spowalniania systemu, ponieważ zwiększają przetwarzanie, które system musi wykonać dla każdej wiadomości. Należy zainstalować haczyk tylko wtedy, gdy jest to konieczne, i usunąć go jak najszybciej.

instagram story viewer