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

时间:2016-04-27 18:23:16

标签: java clipboard awtrobot

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

非常感谢任何帮助!

def create
  @grow = Grow.new(grow_params.merge(category: Category.create(cat_params)))
end

2 个答案:

答案 0 :(得分:2)

这永远不会可靠。无论大小如何,您都必须处理所有格式。阅读延迟渲染(其中数据实际上并不存在于剪贴板上,直到请求粘贴它),您将开始了解问题。某些应用程序(如Excel)可以提供25种以上格式的数据,其中一些非常庞大且复杂。没有时间或RAM来渲染它们。 因此,您无法按原样恢复剪贴板。 并且你根本不能更新剪贴板,而不会触发其他可以识别剪贴板的应用程序"他们的东西"。
最后,你不应该这样使用剪贴板。剪贴板是一个共享资源,为方便用户而不是程序员提供 找另一种方式。

答案 1 :(得分:0)

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

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!!!)
}