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

时间:2011-03-28 15:25:27

标签: java awt keypress awtrobot

我使用以下几行来模拟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]屏幕上有该区域的文字。我错过了什么?

编辑:

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

2 个答案:

答案 0 :(得分:2)

  1. 您的所有代码都应位于try块中,您实例化Robot,因为您可能最终尝试使用空引用并获得NullPointerException。如果您的Robot永远不会被创建并且从未复制过内容,那么您尝试从剪贴板访问内容也毫无意义。

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

  3. 此更新的代码应该有效:

    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 :(得分: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);

希望这会有所帮助。