2016-10-01 3 views
2

У меня есть программа на Java, которая открывает калькулятор Windows с помощью ProcessBuilder. Мне нужно определить, когда программа закрыта пользователем, и появится сообщение о том, что «Программа была успешно закрыта».Как распечатать сообщение, когда пользователь закрывает калькулятор?

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

Можете ли вы добавить дополнительную информацию о своей среде? Я могу воспроизвести проблему, но Ришал дев сингх не мог. Моя среда - это 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