1

我使用以下几行在 Java 中使用机器人模拟 Control_A [全选] 键操作,但剪贴板没有获取文本,为什么?

        Robot robot=null;
        try { robot=new Robot(); }
        catch (AWTException ex) { System.err.println("Can't start Robot: " + ex); }
        robot.mouseMove(260,500);
        robot.mousePress(InputEvent.BUTTON1_MASK);
//        robot.mouseMove(660,700);
        robot.mouseRelease(InputEvent.BUTTON1_MASK);

        robot.keyPress(KeyEvent.VK_CONTROL);              // Select all
        robot.keyPress(KeyEvent.VK_A);
        robot.keyRelease(KeyEvent.VK_A);
        robot.keyRelease(KeyEvent.VK_CONTROL);

        robot.keyPress(KeyEvent.VK_CONTROL);              // Copy
        robot.keyPress(KeyEvent.VK_C);
        robot.keyRelease(KeyEvent.VK_C);
        robot.keyRelease(KeyEvent.VK_CONTROL);

        Transferable t=Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
        try
        {
          if (t!=null && t.isDataFlavorSupported(DataFlavor.stringFlavor))
          {
            String text=(String)t.getTransferData(DataFlavor.stringFlavor);
            System.out.println(text);
          }
        }
        catch (Exception ex) { ex.printStackTrace(); }

我打开了一个浏览器,因此在屏幕上的 [260,500] 处有该区域的文本。我错过了什么?

编辑:

我刚刚发现了一些奇怪的东西,当我打开浏览器时,浏览器中的文本不是副本,但是如果我打开记事本/写字板,其中的文本会是副本,那为什么浏览器没有这样做呢?

4

2 回答 2

2
  1. 您的所有代码都应该try在您实例化的块内,Robot因为您最终可能会尝试使用空引用并获得NullPointerException. 而且,如果您Robot从未创建过并且从未复制过内容,那么您也没有必要尝试从剪贴板访问内容。

  2. 我不完全确定为什么,但在尝试从剪贴板读取之前添加一个小延迟可以解决问题。我猜这可能与 Java在系统有时间更新剪贴板之前获取剪贴板之间的竞争条件有关。

这个更新的代码应该可以工作:

Robot robot = null;
try
{
    robot = new Robot();
    robot.mouseMove(260, 500);
    robot.mousePress(InputEvent.BUTTON1_MASK);
    // robot.mouseMove(660,700);
    robot.mouseRelease(InputEvent.BUTTON1_MASK);

    robot.keyPress(KeyEvent.VK_CONTROL); // Select all
    robot.keyPress(KeyEvent.VK_A);
    robot.keyRelease(KeyEvent.VK_A);
    robot.keyRelease(KeyEvent.VK_CONTROL);

    robot.keyPress(KeyEvent.VK_CONTROL); // Copy
    robot.keyPress(KeyEvent.VK_C);
    robot.keyRelease(KeyEvent.VK_C);
    robot.keyRelease(KeyEvent.VK_CONTROL);

    try
    {
        //sleep just a little to let the clipboard contents get updated
        Thread.sleep(25);
    }
    catch (InterruptedException e)
    {
        e.printStackTrace();
    }

    Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
    try
    {
        if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor))
        {
            String text = (String) t.getTransferData(DataFlavor.stringFlavor);
            System.out.println(text);
        }
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
}
catch (AWTException ex)
{
    System.err.println("Can't start Robot: " + ex);
}
于 2011-03-28T16:48:11.943 回答
1

不确定您的代码上下文,但我在尝试从浏览器上的 PDF 文档中提取文本时遇到了同样的问题。这是误导性的,因为 ctrl-a 突出显示了文本,但 ctlr-c 没有复制任何内容。我的解决方案是首先模拟单击文档上的任意位置,然后是 ctrl-a 和 ctrl-c。我的代码:

        robot = new Robot();
        //Get window size
        Dimension d = driver.manage().window().getSize(); 
        System.out.println("Dimension x and y :"+d.getWidth()+" "+d.getHeight()); 
        int x = (d.getWidth()/4)+20; 
        int y = (d.getHeight()/10)+50; 
        robot.mouseMove(x,y); 

        //Clicks Left mouse button
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); 
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
        Thread.sleep(25);

        // Select all
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_A);
        robot.keyRelease(KeyEvent.VK_A);
        robot.keyRelease(KeyEvent.VK_CONTROL);
        Thread.sleep(100);

        // Copy to clipboard
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_C);
        robot.keyRelease(KeyEvent.VK_C);
        robot.keyRelease(KeyEvent.VK_CONTROL);
        Thread.sleep(100);

希望这可以帮助。

于 2020-04-28T11:11:03.963 回答