gpt4 book ai didi

java - 将剪贴板的所有权设置为 StringSelection 后,CTRL+C 不复制到剪贴板

转载 作者:太空宇宙 更新时间:2023-11-04 06:33:57 25 4
gpt4 key购买 nike

我使用 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 也无法复制到剪贴板。

最佳答案

首先,我认为设置剪贴板数据和将数据提供给其他应用程序之间存在延迟。事实上,有一个小的延迟,在获取内容之前设置 Thread.sleep 对我有帮助......但并非在所有情况下。从那时起它就随机工作了。

然后,我编写了一个应用程序来连续执行剪贴板的system.out.println()(如java程序所示)...但无论我执行多少次CTRL+C,它都只显示旧值(程序启动时的值)。但我确信系统得到了我的 CTRL+C,因为同时 java 说只有旧数据,Windows 剪贴板查看器和 CTRL+V 显示了我刚刚复制的数据。所以,看来只有java无法获取更新。

然后,我将代码移动到用户界面线程之外的另一个线程,问题似乎已经停止了。我认为有一些东西不断接收剪贴板中的更改,但是由于用户界面线程繁忙,即使在 sleep 状态下,也不会收到这些更改。

因此,尝试将代码放入从主线程启动的另一个线程中。

关于java - 将剪贴板的所有权设置为 StringSelection 后,CTRL+C 不复制到剪贴板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25696751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com