Можно ли красиво завершить процесс в приложении Java? - PullRequest
8 голосов
/ 05 июня 2009

В приложении Java:

currentProcess = Runtime.getRuntime().exec("MyWindowsApp.exe");
...
currentProcess.destroy();

Вызов destroy просто убивает процесс и не позволяет выполнять какую-либо пользовательскую очистку или код завершения. Можно ли отправить процессу сообщение WM_CLOSE или подобное?

Ответы [ 5 ]

3 голосов
/ 29 апреля 2011

Используя JNA.jar и process.jar (из http://jna.java.net/), вы отправляете сообщение WM_CLOSE следующим образом:

int WM_CLOSE = 0x10;

HWND hwnd = User32.INSTANCE.FindWindow(null, windowTitle);
User32.INSTANCE.PostMessage(hwnd, WM_CLOSE, new WinDef.WPARAM(), new WinDef.LPARAM());
3 голосов
/ 05 июня 2009

вы можете попробовать с JNA, импортируя user32.dll и определяя интерфейс, который определяет по крайней мере CloseWindow

3 голосов
/ 05 июня 2009

Вы можете использовать Process.getOutputStream , чтобы отправить сообщение в stdin вашего приложения, например:

PrintStream ps = new PrintStream(currentProcess.getOutputStream());
ps.println("please_shutdown");
ps.close();

Конечно, это означает, что вы должны умудриться слушать stdin в приложении Windows.

2 голосов
/ 05 июня 2009

Не без использования нативного кода. Process.destroy() вызывает принудительное завершение. В Windows это эквивалентно вызову TerminateProcess(). В Unix это эквивалентно SIGQUIT и приводит к дампу приложения.

1 голос
/ 05 июня 2009

Грязным решением было бы заставить MyWindowsApp зарегистрировать свой идентификатор где-то вроде файла и создать другое приложение Windows, которое отправляет WM_CLOSE (назовем его MyWindowsAppCloser) другим приложениям.

Имея это в виду, вы должны написать следующее с использованием Java 1.6


currentProcess = Runtime.getRuntime().exec("MyWindowsApp.exe");
...

// get idMyWindowsApp where MyWindowsApp stored its identifier
killerProcess = new ProcessBuilder("MyWindowsAppCloser.exe", idMyWindowsApp).start();
killerProcess.waitFor();

int status = currentProcess.waitFor();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...