我写了一个使用
打开IE的程序Process process=Runtime.getRuntime().exec();
现在我想在我的Swing GUI上点击一下按钮关闭这个IE实例
我试过了process.destroy()
,但它不起作用。
我也读过关于process.waitfor()但是只在IE关闭后调用,即我手动关闭IE。
如果我使用
Runtime.getRuntime().exec("taskkill /F /IM iexplore.exe");
它会杀死IE运行的所有实例 我只想关闭与上述过程相关的IE。
请建议我该怎么做?
答案 0 :(得分:1)
对于Internet Explorer9,这并不简单。 IE9处理多个窗口及其进程的方式限制了通过终止进程来关闭选择性窗口的选项。
即使你找到了正确的进程,杀死它也可能导致杀死所有其他IE窗口。
IE使用SysFader
管理其他窗口和标签,当试图杀死正确的窗口和标签时,它会尝试恢复它。
您可以搜索和查看SIGAR等外部库,以便查询该过程。
对于其他流程,可能有一种方法可以在启动时标记流程,然后在需要关闭流程时保存PID
。
示例只是为了演示这个想法,不要使用这个
Date date = new Date();
DateFormat formatter = new SimpleDateFormat("HHmmssSSS");
String tag = "test"+formatter.format(date);
Process p = Runtime.getRuntime().exec("C:\\Program Files\\Internet Explorer\\iexplore.exe www.google.com/search?q=" + tag );
p.waitFor();
这将标记该过程,因为在详细TASKLIST
中有一个'窗口标题'将显示此标记。
然后,通过解析列表,您可以确定PID
Process p2 = Runtime.getRuntime().exec("TASKLIST /V /FI \"IMAGENAME eq iexplore.exe\"");
BufferedReader input = new BufferedReader(new InputStreamReader(p2.getInputStream()));
String line, pid = "";
while ((line = input.readLine()) != null) {
if(line.contains(tag)){
String[] taskTokens = line.replaceAll("\\s+", " ").trim().split(" ");
pid = taskTokens[1];
System.out.println("PID:"+pid);
}
}
input.close();
然后,如果要关闭指定的PID,可以调用
Runtime.getRuntime().exec("TASKKILL /PID " + pid);
当您使用IE9测试时,您会注意到SysFader
将为您提供与创建新进程相同的PID,但最后一个被调用的具有与之前相同的PID
,获得一个新的PID
。
我无法使用任何其他版本进行测试..您可以根据需要自定义想法