1

我正在用 java 编写一个程序,它可以启动应用程序,例如 firefox。

编辑:该程序适用于 linux,特别是 ubuntu。

启动程序很容易:

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

但是,一旦它完全打开或运行,我想从窗口中检索详细信息。

目前我只是在打电话:

Thread.sleep(delay);

确保窗口已准备就绪,但这是一个糟糕的解决方案。需要不同延迟的不同窗口是个问题。

凌乱。

所以我的问题是,当firefox(或任何其他外部应用程序)完全设置时,有什么方法可以通知我?我不认为我可以使用 Process.waitFor() 因为在 firefox 关闭之前进程不会完成。

提前致谢!

更新: Process.waitFor() 不起作用。我已经尝试过了,它只在 Firefox 关闭时返回,而不是在完全设置时返回。只是对于任何自己尝试的人来说,如果另一个 Firefox 窗口已经打开,它将起作用(起初这把我愚弄了)但如果没有现有的窗口,它就不会!

4

2 回答 2

1

You can use Process#waitFor to wait till the command gets executed and then check the exitValue like this:

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);
}

xdotool 只有在找到一个名为 name 的窗口时才会打印一个字符串。

因此,如果阅读器已准备好(),那么您就知道窗口已打开。

Thread.sleep() 是必要的,因为如果它不存在,xdotool 会吐出一个错误的窗口错误,读者会读到它。

但是,使用我上面提到的标准延迟似乎几乎更快,但是这个解决方案甚至适用于加载时间更长的窗口,而不是试图猜测延迟。

于 2014-07-17T20:37:51.170 回答