是否有可能在Java应用程序中很好地结束进程?

时间:2009-06-05 10:37:41

标签: java

在Java应用程序中:

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

调用destroy只会杀死进程,并且不允许任何用户清理或退出代码运行。是否可以向流程发送WM_CLOSE消息或类似消息?

5 个答案:

答案 0 :(得分:3)

您可以使用Process.getOutputStream向应用的标准输入发送消息,例如:

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

当然这意味着你必须设法在Windows应用程序中监听stdin。

答案 1 :(得分:3)

您可以尝试使用JNA,导入user32.dll并定义至少定义CloseWindow的接口

答案 2 :(得分:3)

使用JNA的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 :(得分:2)

不依赖于本机代码。 Process.destroy()导致强制终止。在Windows上,这相当于调用TerminateProcess()。在Unix上它等同于SIGQUIT并使应用程序进入核心转储。

答案 4 :(得分:1)

一个肮脏的解决方案是让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();