在Java中以编程方式粘贴后恢复剪贴板

在Java中以编程方式粘贴后恢复剪贴板,java,clipboard,awtrobot,Java,Clipboard,Awtrobot,我试图通过编程将一些文本添加到系统剪贴板,从那里将其粘贴到随机应用程序,并将剪贴板恢复到以前的状态,但Java似乎对此有问题。 在十次尝试中,它从未将文本粘贴超过八次,有时甚至会粘贴错误的文本(以前在剪贴板中的文本) 任何帮助都将不胜感激 public class ClipboardTestClass { static Robot robot; public static void main(String[] args) { try {

我试图通过编程将一些文本添加到系统剪贴板,从那里将其粘贴到随机应用程序,并将剪贴板恢复到以前的状态,但Java似乎对此有问题。 在十次尝试中,它从未将文本粘贴超过八次,有时甚至会粘贴错误的文本(以前在剪贴板中的文本)

任何帮助都将不胜感激

public class ClipboardTestClass {
    static Robot robot;

    public static void main(String[] args) {

        try {
            robot = new Robot();
        } catch (AWTException ex) {
            Logger.getLogger(TestApp.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ex) {
            Logger.getLogger(TestApp.class.getName()).log(Level.SEVERE, null, ex);
        }
        for(int i = 0; i< 10; i++){
            enterString("Hello\n");
        }
    }

    public static void enterString(String myString){

        System.out.println("Trying to paste string \"" + myString + "\"");
        StringSelection stringSelection = new StringSelection(myString);
        //save clipboard content
        Transferable clipboardContent = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
        //enter new clipboard content
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents((Transferable) stringSelection, null);

        //paste clipboard content with Robot class
        robot.keyPress(VK_CONTROL);
        robot.keyPress(VK_V);
        robot.keyRelease(VK_CONTROL);
        robot.keyRelease(VK_V);

        //restore clipboard content
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(clipboardContent, null);
    }
}
公共类ClipboardTestClass{
静态机器人;
公共静态void main(字符串[]args){
试一试{
机器人=新机器人();
}捕获(AWEX){
Logger.getLogger(TestApp.class.getName()).log(Level.SEVERE,null,ex);
}
试一试{
《睡眠》(2000年);
}捕获(中断异常例外){
Logger.getLogger(TestApp.class.getName()).log(Level.SEVERE,null,ex);
}
对于(int i=0;i<10;i++){
输入字符串(“Hello\n”);
}
}
公共静态void enterString(字符串myString){
System.out.println(“尝试粘贴字符串\”+myString+“\”);
StringSelection StringSelection=新StringSelection(myString);
//保存剪贴板内容
可转移的剪贴板内容=Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
//输入新的剪贴板内容
Toolkit.getDefaultToolkit().getSystemClipboard().setContents((可转移)stringSelection,null);
//使用Robot类粘贴剪贴板内容
机器人按键(VK_控制);
机器人按键(VK_V);
机器人按键释放(VK_控制);
机器人按键释放(VK_V);
//还原剪贴板内容
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(clipboardContent,null);
}
}

这永远不会可靠地工作。您必须处理所有格式,无论大小。阅读延迟渲染(在提出粘贴请求之前,数据实际上根本不存在于剪贴板上),您将开始了解问题所在。一些应用程序,如Excel,可以提供25种以上格式的数据,其中一些非常大和复杂。没有时间或内存来渲染它们。 因此,您无法恢复剪贴板原来的状态。 如果不触发其他感知剪贴板的应用程序执行“他们的事情”,则根本无法更新剪贴板。
最后,您不应该以这种方式使用剪贴板。剪贴板是一种共享资源,提供它是为了方便用户,而不是程序员。

找到另一种方法。

这永远不会可靠地工作。您必须处理所有格式,无论大小。阅读延迟渲染(在提出粘贴请求之前,数据实际上根本不存在于剪贴板上),您将开始了解问题所在。一些应用程序,如Excel,可以提供25种以上格式的数据,其中一些非常大和复杂。没有时间或内存来渲染它们。 因此,您无法恢复剪贴板原来的状态。 如果不触发其他感知剪贴板的应用程序执行“他们的事情”,则根本无法更新剪贴板。
最后,您不应该以这种方式使用剪贴板。剪贴板是一种共享资源,提供它是为了方便用户,而不是程序员。
找到另一种方法。

对于字符串类型的内容(仅限!!!),我想到了以下代码片段:

import static java.awt.Toolkit.getDefaultToolkit;

public class Main {
    public static void main(String[] args) throws IOException, UnsupportedFlavorException {
        Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();

        // Save the old data
        String oldData = (String) systemClipboard.getContents(null).getTransferData(DataFlavor.stringFlavor);

        // Now lets put some new data to clipboard!
        StringSelection stringSelection = new StringSelection("Jai Hind!! Vandee Maatharam!!!!");
        systemClipboard.setContents(stringSelection, null);

        // Lets print the clipboard content
        String newData = (String) 
        systemClipboard.getContents(null).getTransferData(DataFlavor.stringFlavor);
        System.out.println("Here is the new data: [" + newData + "]");

        // Now setting back the old clipboard content
        StringSelection oldDataSelection = new StringSelection(oldData);
        systemClipboard.setContents(oldDataSelection, null);

        //Now hit CTRL+V in an editor and you should get back the old clipboard content (NOTE: Only String Contents!!!)
}
对于字符串类型的内容(仅限!!!),我想到了以下代码片段:

import static java.awt.Toolkit.getDefaultToolkit;

public class Main {
    public static void main(String[] args) throws IOException, UnsupportedFlavorException {
        Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();

        // Save the old data
        String oldData = (String) systemClipboard.getContents(null).getTransferData(DataFlavor.stringFlavor);

        // Now lets put some new data to clipboard!
        StringSelection stringSelection = new StringSelection("Jai Hind!! Vandee Maatharam!!!!");
        systemClipboard.setContents(stringSelection, null);

        // Lets print the clipboard content
        String newData = (String) 
        systemClipboard.getContents(null).getTransferData(DataFlavor.stringFlavor);
        System.out.println("Here is the new data: [" + newData + "]");

        // Now setting back the old clipboard content
        StringSelection oldDataSelection = new StringSelection(oldData);
        systemClipboard.setContents(oldDataSelection, null);

        //Now hit CTRL+V in an editor and you should get back the old clipboard content (NOTE: Only String Contents!!!)
}