W tym krótkim wpisie pokaże fajną operację która może się przydać w wielu zastosowaniach. Będziemy śledzić kliknięcie skrótu CTRL+C które oczywiście skopiuje zaznaczony tekst do schowka, a następnie ten tekst zmodyfikujemy.
Ja wykorzystałem te funkcje w programie który wysyła zaznaczony tekst do serwisu sztucznej inteligencji a następnie umieszcza w schowku odpowiedź.
Może znajdziesz lepsze zastosowanie, tylko nie myśl o podmienianiu numeru konta :).
Będziemy korzystać za API java AWT (abstract window toolkit) które udostępnia nam funkcje dostępu do schowka.
W pierwszej kolejności musimy przechwycić wciśnięcie klawiszy CTRL+C, w tym celu użyję projektu który pokazałem we wpisie „Keylogger w 5 minut, przechwytujemy klawisze w Javie” i zmodyfikuję funkcję obsługującą wciśnięcie klawisza tak aby reagowała tylko na CTRL+C.
public void nativeKeyPressed(NativeKeyEvent nativeEvent) {
if((nativeEvent.getModifiers() ==NativeKeyEvent.CTRL_L_MASK)&&
nativeEvent.getKeyCode() == NativeKeyEvent.VC_C ) {
System.out.println("Pressed: CTRL+C" );
}
NativeKeyListener.super.nativeKeyPressed(nativeEvent);
}
Następnie stworzyłem klasę ClipboardHelper która zawiera statyczną metodę odczytującą dane ze schowka. Klasa Toolkit z biblioteki AWT pozwala na pobranie obiektu schowka (Clipboard) a wtedy już bez problemu możemy odczytać z niego dane. Upewniamy się oczywiście wcześniej czy w schowku znajdują się dane typu tekstowego.
public class ClipboardHelper {
public static String getData() {
try {
Clipboard clipboard =
Toolkit.getDefaultToolkit().getSystemClipboard();
if(clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor)) {
String data = (String)
clipboard.getData(DataFlavor.stringFlavor);
return data;
}
}catch(Exception e) {
e.printStackTrace();
}
return "";
}
}
Dodam od razu funkcję zapisującą dane do schowka ponieważ również będziemy jej potrzebować, tu podobnie pobieramy obiekt Clipboard a następnie ustawiamy zawartość.
public static void setData(String data) {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection strSel = new StringSelection(data);
clipboard.setContents(strSel, null);
}
Teraz pozostaje nam już tylko uzupełnić funkcję która przechwytuje skrót klawiszowy. Po odnotowaniu użycia CTRL+C następuje pobranie danych ze schowka, następnie ich modyfikacja poprzez zmiany wszystkich liter na wielkie i zapisanie zmodyfikowanej wersji z powrotem do schowka.
Pomiędzy wykryciem wciśnięcia klawiszy a odczytem danych ze schowka dodałem opóźnienie ponieważ bez tego odczytywane dane nie zawsze są aktualne.
public void nativeKeyPressed(NativeKeyEvent nativeEvent) {
if((nativeEvent.getModifiers() == NativeKeyEvent.CTRL_L_MASK)&&
nativeEvent.getKeyCode() == NativeKeyEvent.VC_C ) {
System.out.println("Pressed: CTRL+C" );
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
String clipboardData = ClipboardHelper.getData();
System.out.println("Clipboard data: " + clipboardData );
String cdUpperCase = clipboardData.toUpperCase();
ClipboardHelper.setData(cdUpperCase);
}
NativeKeyListener.super.nativeKeyPressed(nativeEvent);
}
Po uruchomieniu tego programu możemy sprawdzić w dowolnym edytorze tekstu że po zaznaczeniu fragmentu i wykonaniu CTRL+C / CTRL+V tekst ten zostanie wklejony jednak ze wszystkimi literami zamienionymi na wielkie.
Spróbuj sam.
Pozdrawiam