Как напечатать сообщение, когда пользователь закрывает калькулятор?

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

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

Проблема в том, что сообщение появляется при открытии программы.


person Ariishiia    schedule 01.10.2016    source источник
comment
calc.exe, вероятно, просто инициализирует приложение в отдельном потоке, а затем завершает работу. Он не возвращает дескриптор созданного им потока, поэтому вы не можете обнаружить закрытие окна.   -  person 4castle    schedule 01.10.2016
comment
Возможно, этот вопрос поможет вам определить, когда окно закрывается.   -  person 4castle    schedule 01.10.2016
comment
Можете ли вы добавить больше информации о вашей среде? Я могу воспроизвести проблему, но Ришал Дев Сингх не смог. Моя среда — Windows 10 Home v. 1151 с Java 1.8.0.910.   -  person 4castle    schedule 01.10.2016
comment
Windows 10 Pro версии 1607 с Java 1.8.0.101   -  person Ariishiia    schedule 01.10.2016


Ответы (1)


Вы можете периодически проверять, выполняется ли процесс, используя код из этого ответа, а затем публиковать сообщение, когда процесс отсутствующий. В 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");
}
person 4castle    schedule 01.10.2016
comment
Идеально! Большое спасибо! - person Ariishiia; 02.10.2016