为什么在Java中用Robot模拟Control_A不能用?

问题描述 投票:1回答:2

我在Java中用机器人模拟Control_A [select all]键的操作,但剪贴板上没有文字,为什么?

        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]处有文字。我错过了什么?

编辑:我刚刚发现了一个奇怪的事情,当我打开浏览器时,在[260,500]的屏幕上有文字,我错过了什么?

我刚刚发现一个奇怪的现象,当我打开浏览器的时候,浏览器里的文字不是复制的,但是如果我打开记事本,里面的文字就会被复制,为什么浏览器没有做到呢?

java awt keypress awtrobot
2个回答
2
投票
  1. 你所有的代码都应该在 try 块,在这里您可以实例化 Robot 因为你可能最终会试图使用一个null引用,并得到一个 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);
}

1
投票

我不知道你的代码背景是什么 但我在浏览器上提取PDF文档中的文本时也遇到了同样的问题 这是个误导,因为ctrl -a高亮了文本 但ctrl -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);

希望能帮到你

© www.soinside.com 2019 - 2024. All rights reserved.