Winbot – Symulacja globalnych zdarzeń (myszka i klawiatura)

Prace nad moim projektem Winbot wciąż trwają. Chociaż czas mija nieubłaganie szybko, a dzień ma tylko 24 godziny, to staram się systematycznie rozwijać Winbot’a o nowe funkcje i usprawnienia. W dzisiejszym poście postanowiłem przedstawić sposób w jaki rozwiązałem problem z symulacją globalnych zdarzeń (np. kliknięcie myszką, wciśnięcie klawisza Ctrl, itp.).

Moim celem było zaimplementowanie logiki, która wywoływałaby konkretne zdarzenie systemowe. Nie było to trywialne zadanie. Oczywiście mogłem skorzystać z gotowej biblioteki, która oferuje taką funkcjonalność, ale zdecydowałem, że jest to ciekawy temat i warto się w niego zagłębić. No więc jak spowodować aby nasz system pomyślał, że właśnie teraz nastąpiło kliknięcie myszką w konkretnym miejscu? Nie udało mi się znaleźć rozwiązania w oparciu o standardowe biblioteki .NET. Na szczęście jest jeszcze WinAPI, które pozwala nam na trochę więcej.

Tak wygląda moja klasa służąca do symulacji myszki.

Jak widać korzystam tutaj z dwóch funkcji: mouse_event i SetCursorPos, oraz z kilku stałych reprezentujących konkretne zdarzenie. Myślę, że ich przeznaczenie i rola są jasne. Implementacja funkcji dostarczającej symulację kliknięcia myszką wygląda następująco:

  1. Ustaw kursor myszki w danym miejscu (za pomocą SetCursorPos)
  2. Wciśnij przycisk myszki (mouse_event)
  3. Puść przycisk myszki (mouse_event)

Klasa odpowiadająca za symulację klawiatury wygląda w ten sposób.

W tym przypadku korzystam z deklaracji tylko jednej funkcji keybd_event oraz dwóch zmiennych reprezentujących zdarzenia: wciśnięcie i zwolnienie klawisza/klawiszy. Na szczęście nie było potrzeby dodawania zmiennych dla każdego z klawiszy klawiatury. Okazało się, że typ wyliczeniowy Keys ma definicję odpowiednich kodów i można z niego tutaj skorzystać. Warto zwrócić uwagę, że za pomocą tej funkcji możliwe jest wywołanie jednoczesnego wciśnięcia/zwolnienia kilku klawiszy. Przykład dla kombinacji Shift + Alt + A.

Mam nadzieję, że przedstawiony kod jest jasny i zrozumiały. Być może będziecie kiedyś musieli w swojej aplikacji skorzystać z globalnych zdarzeń lub czegoś innego, co będzie wydawało się niemożliwe do osiągnięcia za pomocą standardowych metod. Pamiętajcie wtedy, że jest jeszcze WinAPI 🙂

Dodaj komentarz

Twój adres email nie będzie opublikowany. Pola wymagane zostały oznaczone *