Jak dobrać się do schowka Windows w Javie

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