Java JNA, user32.dll – przechwytujemy aplikacje okienkowe

lib-dll-javaZdarzają się takie sytuacje, że chcielibyśmy naszym programem sterować inną aplikacją okienkową. W tym artykule wprowadzę was w temat pobierania danych z programów windowsowych za pomocą funkcji biblioteki user32.dll wywoływanych z poziomu Javy. W Javie możemy wywoływać natywny kod z bibliotek DLL w dosyć łatwy sposób dzięki JNA – Java Native Access.

Zastosowania

Np. w mojej pracy inżynierskiej wykorzystałem JNA do sterowania znanym dawniej odtwarzaczem muzycznym WinAmp, czy PowerPointem. Wpadłem też kiedyś na pomysł, żeby przechwytywać z Total Commandera aktualną ścieżkę w której się znajduję aby po uruchomieniu skrótu klawiaturowego uruchomiła się konsola w tej samej lokalizacji. W tym przypadku akurat wykorzystałem AutoHotkeya i napisałem skrypt wywołujący funkcje z biblioteki user32.dll.
Napisałem również program rejestrujący czasy aktywności wszystkich okien w Windowsie, dzięki któremu generuję dzienny raport pracy: nad jakim projektem pracowałem (dzięki umieszczeniu w tytule okna ścieżki aktualnie edytowanej klasy w Netbeansie), ile razy odchodziłem od komputera i jaki był tego łączny czas (każde wylogowanie WIN+L), itd.

Zastosowań może być mnóstwo, a z JNA korzystają takie projekty jak:

  • IntelliJ IDEA
  • Netbeans
  • Log4j – biblioteka do logowania
  • Hudson
  • Apache Cassandra
  • i wiele innych

Narzędzia do badania okien

Osobiście korzystam z dwóch narzędzi do badania komponentów okienek. Są to:

  1. Active Window Info (Window Spy) dołączony do programu AutoHotKey.
    Po jego uruchomieniu przesuwamy wskaźnik myszy nad interesujący nas komponent innego programu i otrzymujemy informację na jego temat.
    active_window_info
  2. WinSpy++
    winspy1
    Bardziej zaawansowany – aby pobrać informacje o komponencie, przeciągamy na niego ikonkę, po czym pojawi się znacznie więcej informacji niż w przypadku poprzedniego programu:
    winspy2
    Jeśli klikniemy w przycisk „More”, a następnie „Locate” nasz komponent zostanie wyszukany i wyświetlony w drzewie:
    winspy3

 

Hello world – pobieramy tekst z Notepada++

Uruchamiamy program i wpisujemy jakiś tekst w edytorze:

notepad

Badamy element w WinSpy++ i otrzymujemy informacje:

notepad2

To, co nas interesuje to Class okna programu (Notepad++) i komponentu (Scintilla).

Kod w Javie

W projekcie mavenowym dodajemy zależności do JNA:

Tworzymy interfejs do biblioteki user32.dll

W nowej klasie dodajemy metodę zwracającą uchwyt do komponentu edytora Notepada++:

oraz pomocnicze metody do pobierania tekstu i jego długości dla wskazanego komponentu:

Zawartość całej klasy wygląda następująco:

Po uruchomieniu otrzymujemy na wyjściu zawartość pola edycyjnego notatnika:

Zwróćcie uwagę, że nie ma problemów z kodowaniem polskich znaków.

Jest to klasa robocza, a docelowo po refaktoryzacji metoda getNotepadEditHWND() jak i kolejne związane związane z obsługą konkretnych programów powinny znaleźć się z w osobnych klasach komunikujących się z naszą WinApi.

Podsumowanie

W przedstawionym przykładzie jest wiele uproszczeń. Np. w metodzie getNotepadEditHWND() pobieranie uchwytu do klasy „Scintilla” zostało wykonane z założeniem, że jest to pierwsza klasa tego typu w oknie „Notepad++”. W kolejnym artykule przedstawię rozwiązanie dla zagnieżdżonych komponentów z rekurencyjnym ich przeszukiwaniem na przykładzie Total Commandera.

 

Książki do nauki Javy

 

To również może Cię zainteresować:

  • Java JNA #2, Total CommanderJava JNA #2, Total Commander W poprzednim wpisie zrobiłem krótkie wprowadzenie do wykorzystywania biblioteki user32.dll przez Javę do pobierania informacji z innych aplikacji okienkowych. Poniżej rozszerzymy nasze […]
  • Własny protokół URL Scheme, jak uruchomić aplikację desktopową z przeglądarki?Własny protokół URL Scheme, jak uruchomić aplikację desktopową z przeglądarki? Podczas rozwijania aplikacji webowej np. klasy ERP / CRM, prędzej czy później będziemy musieli wykonać obsługę urządzeń zainstalowanych bezpośrednio na komputerze użytkownika. Może to być […]
  • 10-letni chłopak zdobył 100% na egzaminie OCPJP z Javy!10-letni chłopak zdobył 100% na egzaminie OCPJP z Javy! W zeszłym roku Ronil Shah zaskoczył prawie wszystkich zdobywając sto procent punktów w egzaminie z Javy OCPJP. Jednak to nie wszystko. Najciekawsze jest to, że egzamin ten przewidziany […]
  • Fundamenty języka JavaFundamenty języka Java Niecały miesiąc temu zostałem poproszony przez Strefę Kursów o ocenę ich nowo wydanego materiału dla osób chcących zacząć naukę programowania w Javie: "Fundamenty języka Java". Przerobiłem […]
  • Wzorce projektowe – singletonWzorce projektowe – singleton Singleton - jeden ze wzorców konstrukcyjnych. Jego celem jest zapewnienie możliwości utworzenia tylko jednego obiektu danej klasy i zapewnienie do niego globalnego dostępu. Przez wielu […]
  • Arduino – zdalne sterowanie oświetleniemArduino – zdalne sterowanie oświetleniem W tym artykule opiszę sposób wykonania zdalnego sterowania jednym urządzeniem wpinanym do gniazdka 230V z wykorzystaniem Arduino. Wykorzystane będzie połączenie przez USB z komputerem, […]

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *