在Java应用程序中:
currentProcess = Runtime.getRuntime().exec("MyWindowsApp.exe");
...
currentProcess.destroy();
调用destroy
只会杀死进程,并且不允许任何用户清理或退出代码运行。是否可以向流程发送WM_CLOSE
消息或类似消息?
答案 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();