2009-06-05 22 views

答えて

3

あなたはあなたのアプリケーションの標準入力、例えばにメッセージを送信するためにProcess.getOutputStreamを使用することができます。もちろん、これはあなたがWindowsのアプリでSTDINで待機するように工夫しなければならないことを意味

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

+0

おかげで、すべてのソリューションを、これは最高のようです! –

3

あなたはuser32.dllのをインポートし、少なくともCloseWindow

+0

+1 JNIかもしれない?私はWindowsにkill-SIGTERMのようなユーティリティがあるのだろうかと思う。 – ATorras

1

汚いソリューションは、あなたの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(); 

2

ないを使用して、次のコードをでしょう。 Process.destroy()は強制終了させます。 Windowsでは、これはTerminateProcess()を呼び出すのと同じです。 Unixでは、SIGQUITに相当し、アプリケーションをコアダンプにします。

+1

SIGKILLはコアをダンプしない!これはSIGQUITではありません(デフォルトでコアをダンプします)。 –

+0

私は訂正しました。私はUnixバージョンのJavaがSIGQUITを送信しなければならないと思います(コアダンプが確実に発生します)。私はこの答えを更新します。ありがとうございました。 –

3

次のように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()); 
関連する問題