Почему не работает моделирование Control_A с помощью Robot в Java? - PullRequest
1 голос
/ 28 марта 2011

Я использую следующие строки для имитации действия клавиши Control_A [выбрать все] в Java с роботом, но буфер обмена не получает текст, почему?

        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] есть текст в этой области. Что я пропустил?

Edit:

Я только что нашел что-то странное, когда я открывал браузер, текст в браузере не копирует, но если я открою блокнот / WordPad, текст в них будет копией, так почему браузер не сделал этого

1 Ответ

2 голосов
/ 28 марта 2011
  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);
}
...