:destroy
を呼び出すJavaアプリケーションでプロセスをうまく終了できますか? Javaアプリケーションで
currentProcess = Runtime.getRuntime().exec("MyWindowsApp.exe");
...
currentProcess.destroy();
は、単にプロセスを強制終了し、任意のユーザーのクリーンアップや終了コードを実行することはできません。 WM_CLOSE
メッセージなどを送信できますか?
:destroy
を呼び出すJavaアプリケーションでプロセスをうまく終了できますか? Javaアプリケーションで
currentProcess = Runtime.getRuntime().exec("MyWindowsApp.exe");
...
currentProcess.destroy();
は、単にプロセスを強制終了し、任意のユーザーのクリーンアップや終了コードを実行することはできません。 WM_CLOSE
メッセージなどを送信できますか?
あなたはあなたのアプリケーションの標準入力、例えばにメッセージを送信するためにProcess.getOutputStreamを使用することができます。もちろん、これはあなたがWindowsのアプリでSTDINで待機するように工夫しなければならないことを意味
PrintStream ps = new PrintStream(currentProcess.getOutputStream());
ps.println("please_shutdown");
ps.close();
。
あなたはuser32.dllのをインポートし、少なくともCloseWindow
+1 JNIかもしれない?私はWindowsにkill-SIGTERMのようなユーティリティがあるのだろうかと思う。 – ATorras
汚いソリューションは、あなたのMyWindowsAppがどこかのファイルのようにその識別子を登録し、WM_CLOSEを送信し、別のウィンドウのアプリを(作成作ることになる定義するインターフェイスを定義し、JNAで試すことができます別のアプリケーションに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();
ないを使用して、次のコードをでしょう。 Process.destroy()
は強制終了させます。 Windowsでは、これはTerminateProcess()
を呼び出すのと同じです。 Unixでは、SIGQUIT
に相当し、アプリケーションをコアダンプにします。
SIGKILLはコアをダンプしない!これはSIGQUITではありません(デフォルトでコアをダンプします)。 –
私は訂正しました。私はUnixバージョンのJavaがSIGQUITを送信しなければならないと思います(コアダンプが確実に発生します)。私はこの答えを更新します。ありがとうございました。 –
次のようにWM_CLOSEメッセージを送る(http://jna.java.net/から)JNAのjna.jarとprocess.jarの使用:
int WM_CLOSE = 0x10;
HWND hwnd = User32.INSTANCE.FindWindow(null, windowTitle);
User32.INSTANCE.PostMessage(hwnd, WM_CLOSE, new WinDef.WPARAM(), new WinDef.LPARAM());
おかげで、すべてのソリューションを、これは最高のようです! –