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).
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.