1

たとえば、firefox などのアプリケーションを起動できるプログラムを Java で作成しています。

編集: このプログラムは Linux、特に ubuntu 用です。

プログラムを開始するのは簡単です:

Runtime.getRuntime().exec("/usr/bin/firefox");

ただし、ウィンドウが完全に開いているか実行されている場合は、ウィンドウから詳細を取得したいと考えています。

現時点では、私はちょうど電話しています:

Thread.sleep(delay);

ウィンドウの準備ができていることを確認しますが、これは不十分な解決策です。異なる遅延を必要とする異なるウィンドウは問題です。

混雑。

私の質問は、firefox (またはその他の外部アプリケーション) が完全にセットアップされたときに通知を受ける方法はありますか? Process.waitFor() は、Firefox を閉じるまで終了しないため、使用できないと思います。

前もって感謝します!

更新: Process.waitFor() は機能しません。私はそれを試してみましたが、完全にセットアップされたときではなく、Firefox が閉じられたときにのみ返されます。自分で試してみると、別のFirefoxウィンドウがすでに開いている場合は機能しますが(最初はだまされました)、既存のウィンドウがない場合は機能しません!

4

2 に答える 2

1

Process#waitForコマンドが実行されるまで待機してから、次のexitValueように確認できます。

Process p = Runtime.getRuntime().exec("/usr/bin/firefox");
p.waitFor();

if(p.exitValue()==0) {

  //success
} else {
  // fail read error stream or out stream for possible causes
}
于 2014-07-17T12:00:33.607 に答える
0

わかりました、もう少し考えてみましたが、かなり満足のいく答えが得られました。

ウィンドウの準備が整うまで待つ代わりに、xdotool を使用して継続的に検索します。

while(line == null){
        writer.write("xdotool search --onlyvisible --name " + name + "\n");
        writer.flush();
        if(reader.ready())
            line = reader.readLine();

        Thread.sleep(1000);
}

name という名前のウィンドウが見つかった場合、xdotool は文字列のみを出力します。

したがって、リーダーが ready() であれば、ウィンドウが開いていることがわかります。

Thread.sleep() が存在しない場合、xdotool が不正なウィンドウ エラーを吐き出し、リーダーがそれを読み取るため、Thread.sleep() が必要です。

ただし、上記で説明したように標準の遅延を使用する方がほとんど速いようですが、この解決策は、遅延を推測しようとするのではなく、ロードに時間がかかるウィンドウでも機能します。

于 2014-07-17T20:37:51.170 に答える