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これは、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);
}
于 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 に答える