Dokonałem tu pewnej prowokacji w tytule :), tak naprawdę wcale nie miałem zamiaru pisać keyloggera, zresztą jest tego mnóstwo jak ktoś potrzebuje.
Przechwytywanie klawiszy wykorzystałem do reagowania na skróty klawiszowe niezależnie od tego czy okno programu jest aktywne, czy pracujemy w dowolnym innym programie.
Przedstawię tu dość prosty sposób jak można to zrealizować za pomocą zewnętrznej biblioteki (opensource) JNativeHook.
W pierwszej kolejności trzeba pobrać jar-a ze strony https://github.com/kwhat/jnativehook i zaimportować go do naszego projektu.
Następnie rejestrujemy naszego hooka np. w funkcji main
public static void main(String[] args) {
try {
GlobalScreen.registerNativeHook();
GlobalScreen.addNativeKeyListener(new MyKeyListener());
} catch (NativeHookException e) {
e.printStackTrace();
}
}
Oraz dodajemy obiekt klasy dziedziczącej po NativeKeyListener, ja stworzyłem klasę MyKeyListener i dodałem niezbędne metody.
public class MyKeyListener implements NativeKeyListener{
@Override
public void nativeKeyPressed(NativeKeyEvent nativeEvent) {
NativeKeyListener.super.nativeKeyPressed(nativeEvent);
}
@Override
public void nativeKeyReleased(NativeKeyEvent nativeEvent) {
NativeKeyListener.super.nativeKeyReleased(nativeEvent);
}
}
I to wystarczy, po wciśnięciu klawisza wywoływana jest metoda nativeKeyPressed a po zwolnieniu oczywiście nativeKeyReleased. Aby wyświetlić jaki klawisz został wciśnięty wystarczy dodać do funkcji kod:
System.out.println("Pressed: " +
nativeEvent.getKeyText(nativeEvent.getKeyCode()));
Jeśli natomiast interesuje nas skrót klawiszowy czyli np CTRL+ALT+klawisz to możemy wykorzystać następujący kod:
if(nativeEvent.getModifiers() ==
(NativeKeyEvent.CTRL_L_MASK | NativeKeyEvent.ALT_L_MASK) ) {
System.out.println("Pressed: " +
nativeEvent.getKeyText(nativeEvent.getKeyCode()));
}
W tym przypadku kod klawisza zostanie wypisany tylko jeśli naciśnięty zostanie razem z CTRL+ALT.
I to wystarczy, proste prawda? Teraz możesz tylko znaleźć zastosowanie dla tej funkcjonalności, jak ja to wykorzystałem napiszę w kolejnych wpisach.
Pozdrawiam