2016-10-01 83 views
2

我有一个Java程序,用ProcessBuilder打开Windows计算器。我需要检测用户关闭程序的时间,并显示一条消息,提示“程序已成功关闭”。如何在用户关闭计算器时打印消息?

Process p = Runtime.getRuntime().exec("calc.exe"); 
p.waitFor(); 
System.out.println("Program has been closed successfully"); 

问题是当程序打开时出现消息。

+0

'calc.exe'大概只是初始化在一个单独的线程的应用程序,然后退出。它不会返回它创建的线程的句柄,因此您无法检测到窗口关闭。 – 4castle

+0

也许[这个问题](http://stackoverflow.com/q/54686/5743988)将帮助您检测窗口何时关闭。 – 4castle

+0

你可以添加更多关于你的环境的信息吗?我可以重现这个问题,但是Rishal dev singh不能。我的环境是Windows 10 Home v。1151,使用Java 1.8.0.910 – 4castle

回答

0

您可以使用this answer中的代码定期检查进程是否仍在运行,然后在进程丢失时发布消息。在Windows 10上,您正在寻找的进程是Calculator.exe

这里是一个Java 8的方法来检查是否正在运行的进程:

private static boolean processIsRunning(String processName) throws IOException { 

    String taskList = System.getenv("windir") + "\\system32\\tasklist.exe"; 
    InputStream is = Runtime.getRuntime().exec(taskList).getInputStream(); 

    try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) { 
     return br 
      .lines() 
      .anyMatch(line -> line.contains(processName)); 
    } 

} 

然后你就可以等待processIsRunning("Calculator.exe")是真实的。

这里有一个快速和肮脏的实施是:

public static void main(String[] args) throws Exception { 
    Runtime.getRuntime().exec("calc.exe").waitFor(); 
    while (processIsRunning("Calculator.exe")) { 
     Thread.sleep(1000); // make this smaller if you want 
    } 
    System.out.println("Program has been closed successfully"); 
} 
+0

其完美!非常感谢你! – Ariishiia

相关问题