我使用StringSelection和clipbaord方法粘贴字符串。
StringSelection selection = new StringSelection("myString");
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(selection, selection);
这使剪贴板的所有权成为选择。然后我使用机器人粘贴有效的内容,但后来当我使用机器人尝试在屏幕上复制所选文本时,通过模拟CTRL + C,它似乎失败了。然后我设置一个字符串到剪贴板的内容,我得到“mystring”。
//Control+c
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyType(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.delay(3000);
//save clipboard into string
String newString = "";
try {
newString = (String) Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor);
} catch (HeadlessException e) {
e.printStackTrace();
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.err.println(newString);//prints "myString"
我认为这可能是由类剪贴板的setContents方法的第二个参数引起的,其中剪贴板的所有权被赋予选择权。我不知道如何重置剪贴板的所有权。 Java文档说,当另一个应用程序或该应用程序中的另一个对象断言剪贴板的所有权时,将调用lostOwnership方法。所以我不认为这是因为它不会释放所有权。
手动使用ctrl + c也无法复制到剪贴板。
答案 0 :(得分:1)
首先,我认为在设置剪贴板数据和将数据提供给其他应用程序之间存在延迟。事实上,有一个小的延迟,并在获取内容之前设置Thread.sleep帮助了我......但并非在所有情况下。从那以后它随机工作。
然后,我编写了一个应用程序来连续执行剪贴板的system.out.println()(如java程序所示)...但无论我做了多少次CTRL + C,它只显示旧的value(程序启动时的值)。但我确信系统得到了我的CTRL + C,因为同时java说只有旧数据,windows剪贴板查看器和CTRL + V显示我刚才复制的数据。所以,似乎只有java才能获得更新。
然后,我将代码移动到用户界面线程之外的另一个线程,问题似乎已经停止。我认为有一些东西会继续接收剪贴板中的更改,但是如果用户界面线程忙,即使有睡眠,也不会收到这些更改。
因此,尝试将您的代码放在从主线程启动的另一个线程中。