Hej!
Piszę program służący do przechwytywania i edycji schowka systemowego.
- Zauważyłem, że program działa poprawnie, jeśli uśpię wątek (chociażby na jedną milisekundę). Miejsce "snu" zaznaczyłem w kodzie Caps Lockiem.
- Jeśli tego nie robię, to program przechwytuje schowek, tylko jeśli kopiuję jakiś kod z mojego IDE Eclipse (nie z zewnętrznych aplikacji), do tego nie można wklejać zawartości schowka, a komputer głośno działa.
Zdaję sobie sprawę, że while(true) nie jest najlepszym rozwiązaniem (wersja robocza), w późniejszej wersji napiszę jakoś while(hasToRun), żeby to kontrolować.
Co może powodować to dziwne zachowanie programu?
Z góry dzięki!
import java.awt.HeadlessException;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
public class ClipboardLinkShortener extends Thread implements ClipboardOwner, Runnable {
public static Clipboard myClipboard = null;
public static String previous = null;
public static String clipboardString = null;
public static int i = 0;
public void run() {
while (true) {
myClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
boolean success = false;
/*
* ONLY WITH THE NEXT TRY-CATCH BLOCK THE PROGRAM WORKS.
*/
try {
Thread.sleep(1);
} catch (Exception e1) {
e1.printStackTrace();
}
try {
/*
* Throws an UnsupportedFlavorException, if plaintext cannot be
* derived from the clipboard.
*/
clipboardString = (String) myClipboard.getData(DataFlavor.stringFlavor);
/*
* Variable success is true when no exception is thrown one line above.
*/
success = true;
} catch (UnsupportedFlavorException | IOException e) {
/*
* No plaintext form can be derived from clipboard contents.
* Optional:
*/
continue;
} catch (IllegalStateException e) {
previous = null;
} finally {
if (success) {
/*
* If contents of clipboard have been updated:
*/
if (previous == null || !clipboardString.equals(previous)) {
System.out.println((++i) + ". update of clipboard:");
System.out.println(clipboardString);
previous = clipboardString;
}
}
}
}
}
@Override
public void lostOwnership(Clipboard c, Transferable t) {
System.out.println("Lost!");
}
public static void main(String[] args) throws IOException, HeadlessException, UnsupportedFlavorException {
new Thread(new ClipboardLinkShortener()).start();
}
}
"My code works but I don't know why..."