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