使用Java清除和编辑剪贴板

时间:2017-01-14 15:55:33

标签: java eclipse clipboard robot

我在与系统剪贴板交互时遇到一些问题(编辑,清除它等)。

我有以下代码,当您构建它并双击Jar文件时,它会为您选择的不同网站打开多个浏览器窗口。

import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.datatransfer.*;
import java.awt.Toolkit;

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;

//import clip.Clipboard.*;
public class main {

public static void main(String[] args) {

//Open Chrome
int keyControl = KeyEvent.VK_CONTROL;
int keyT = KeyEvent.VK_T;

// TODO Auto-generated method stub
     try {
     Process p = Runtime.getRuntime().exec("\"/Program Files (x86)/Google/Chrome/Application/chrome.exe\"");
p.waitFor();
System.out.println("Google Chrome launched!");
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {

        Robot robot = new Robot();

        //Sites
        String site = "www.youtube.com";
        String site2 = "www.facebook.com";

        //SITE 1 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        //Load Url
        StringSelection ss = new StringSelection(site);
        Clipboard clpbrd = Toolkit.getDefaultToolkit().getSystemClipboard();
        clpbrd.setContents(ss, null);

        //Enter URL
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_ENTER);
        robot.keyRelease(KeyEvent.VK_ENTER);

        //Clear Clipboard
        String empty = "";
        StringSelection ss2 = new StringSelection(empty);
        clpbrd = Toolkit.getDefaultToolkit().getSystemClipboard();
        clpbrd.setContents(ss2, null);

        //SITE 2  \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        //Load Url 
        StringSelection ss3 = new StringSelection(site2);
        clpbrd = Toolkit.getDefaultToolkit().getSystemClipboard();
        clpbrd.setContents(ss3, null);

        //Create new tab
        robot.keyPress(keyControl);
        robot.keyPress(keyT);
        robot.keyRelease(keyControl);
        robot.keyRelease(keyT);

        //Enter URL
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_ENTER);
        robot.keyRelease(KeyEvent.VK_ENTER);
        }

        catch (Exception e) {
        e.printStackTrace();
    }

    }
}

当我尝试运行此程序时,它会打开选​​项卡,但每个选项卡都是相同的链接。所以它似乎遇到了剪贴板的问题。这是我在代码中使用剪贴板的第一次经历。

如何使这项工作?我无法下载任何webdrivers / etc来解决问题。

1 个答案:

答案 0 :(得分:0)

我已经将代码重构为更干净的代码,而不会改变你基本上在你的代码中所做的事情,因为你的代码很适合我。我只是想用这个版本作为讨论的基础:

package de.scrum_master.stackoverflow;

import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class BrowserRemoteControl {
  private static final Clipboard CLIPBOARD = Toolkit.getDefaultToolkit().getSystemClipboard();
  private static final Robot ROBOT = createRobot();

  public static void main(String[] args) throws IOException, InterruptedException, AWTException {
    startChrome();
    List<String> sites = Arrays.asList("youtube.com", "facebook.com");
    for (String site : sites) {
      setClipboardContent(site);
      enterURLFromClipboard();
      createNewBrowserTab();
    }
  }

  private static Robot createRobot() {
    try {
      return new Robot();
    } catch (AWTException e) {
      throw new RuntimeException("Cannot create Robot instance", e);
    }
  }

  private static void startChrome() throws IOException, InterruptedException {
    Process process = Runtime.getRuntime().exec("\"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe\"");
    process.waitFor();
    System.out.println("Google Chrome launched");
  }

  private static void setClipboardContent(String text) {
    CLIPBOARD.setContents(new StringSelection(text), null);
  }

  private static void enterURLFromClipboard() throws InterruptedException {
    // Ctrl-V
    ROBOT.keyPress(KeyEvent.VK_CONTROL);
    ROBOT.keyPress(KeyEvent.VK_V);
    ROBOT.keyRelease(KeyEvent.VK_V);
    ROBOT.keyRelease(KeyEvent.VK_CONTROL);
    // Enter
    ROBOT.keyPress(KeyEvent.VK_ENTER);
    ROBOT.keyRelease(KeyEvent.VK_ENTER);
    // Wait a little while
    Thread.sleep(250);
  }

  private static void createNewBrowserTab() {
    // Ctrl-T
    ROBOT.keyPress(KeyEvent.VK_CONTROL);
    ROBOT.keyPress(KeyEvent.VK_T);
    ROBOT.keyRelease(KeyEvent.VK_CONTROL);
    ROBOT.keyRelease(KeyEvent.VK_T);
  }
}

我希望你不介意最后的额外空浏览器标签,但我想避免为最后一个网站制作例外。

由于你的代码对我有用,即使没有清理它们之间的剪贴板,我猜你有某种时间问题或竞争条件。

更新:我设法重现了一次(也只是一次)问题。所以我在粘贴网址并按Enter后添加了Thread.sleep(),以便向您展示如何在可能导致问题的所有地方执行相同操作。

随时提出后续问题。