Przechwytywanie danych wprowadzanych z klawiatury za pomocą Delphi

Zaczep do klawiatury Delphi dla TImage

Zaczep na klawiaturę Delphi dla TImage. About.com





Zastanów się przez chwilę nad stworzeniem jakiejś szybkiej gry zręcznościowej. Cała grafika jest wyświetlana, powiedzmy, w TPainBox. TPaintBox nie może otrzymać fokusa wejściowego — żadne zdarzenia nie są uruchamiane, gdy użytkownik naciśnie klawisz; nie możemy przechwycić klawiszy kursora, aby przesunąć nasz pancernik. Delfy Wsparcie!

Przechwytywanie danych wprowadzanych z klawiatury

Większość aplikacji Delphi zazwyczaj obsługuje dane wejściowe użytkownika za pomocą określonych programów obsługi zdarzeń, które umożliwiają nam przechwytywanie użytkownika naciśnięcia klawiszy i procesruch myszy.



Wiemy, że fokus to możliwość odbierania danych wejściowych użytkownika za pomocą myszy lub klawiatury. Tylko obiekt, na którym znajduje się fokus, może otrzymać zdarzenie z klawiatury . Niektóre kontrolki, takie jak TImage, TPaintBox, TPanel i TLabel, nie mogą otrzymywać fokusu. Głównym celem większości kontrolek graficznych jest wyświetlanie tekstu lub grafiki.

Jeśli chcemy przechwycić dane wejściowe z klawiatury dla kontrolek, które nie mogą otrzymać fokusu wejściowego, będziemy musieli poradzić sobie z Windows API, hookami, wywołaniami zwrotnymi i wiadomości .



Haki Windows

Z technicznego punktu widzenia funkcja „hak” jest funkcją wywołania zwrotnego, którą można wstawić do systemu komunikatów Windows, aby aplikacja mogła uzyskać dostęp do strumienia komunikatów, zanim nastąpi inne przetwarzanie komunikatu. Wśród wielu typów haków systemu Windows, hak klawiatury jest wywoływany za każdym razem, gdy aplikacja wywołuje funkcję GetMessage() lub PeekMessage() i istnieje komunikat klawiatury WM_KEYUP lub WM_KEYDOWN do przetworzenia.

Aby utworzyć zaczep klawiatury, który przechwytuje wszystkie dane wejściowe z klawiatury skierowane do danego wątku, musimy wywołać Ustaw WindowsHookEx Funkcja API. Procedury, które odbierają zdarzenia klawiatury, to zdefiniowane przez aplikację funkcje wywołania zwrotnego zwane funkcjami przechwytującymi (KeyboardHookProc). System Windows wywołuje funkcję przechwytującą dla każdej wiadomości naciśniętej klawiszem (klawisz w górę i w dół), zanim wiadomość zostanie umieszczona w kolejce wiadomości aplikacji. Funkcja haka może przetwarzać, zmieniać lub odrzucać naciśnięcia klawiszy. Hooki mogą być lokalne lub globalne.

The wartość zwrotu of SetWindowsHookEx jest uchwytem do właśnie zainstalowanego hooka. Przed zakończeniem aplikacja musi wywołać OdczepOknaHookEx funkcja zwalniająca zasoby systemowe związane z podpięciem.

Przykład haka na klawiaturę

Jako demonstrację zaczepów klawiatury stworzymy projekt z graficzną kontrolą, która może odbierać naciśnięcia klawiszy. TImage wywodzi się z TGraphicControl, może być używany jako powierzchnia do rysowania w naszej hipotetycznej grze bitewnej. Ponieważ TImage nie może odbierać naciśnięć klawiatury poprzez standardowe zdarzenia klawiatury, utworzymy funkcję przechwytującą, która przechwytuje wszystkie dane wprowadzane z klawiatury skierowane na powierzchnię rysowania.



Zdarzenia klawiatury przetwarzania TImage

Zacząć nowy Projekt Delphi i umieść jeden komponent obrazu na formularzu. Ustaw właściwość Image1.Align na alClient. To tyle, jeśli chodzi o część wizualną, teraz musimy trochę zakodować. Najpierw potrzebujemy trochę zmienne globalne :

|_+_|

Aby zainstalować hook, wywołujemy SetWindowsHookEx w zdarzeniu OnCreate formularza.



|_+_|

Aby zwolnić zasoby systemowe związane z podpięciem, musimy wywołać funkcję UnhookWindowsHookEx w zdarzeniu OnDestroy:

|_+_|

Najważniejszą częścią tego projektu jest Procedura wywołania zwrotnego KeyboardHookProc używane do przetwarzania naciśnięć klawiszy.



|_+_|

Otóż ​​to. Mamy teraz ostateczny kod przetwarzania klawiatury.

Zauważ tylko jedną rzecz: ten kod nie jest w żaden sposób ograniczony do użycia tylko z TImage.



Funkcja KeyboardHookProc służy jako ogólny mechanizm KeyPreview i KeyProcess.