2009-06-05 3 views

Antwort

3

könnten Sie Process.getOutputStream verwenden, um eine Nachricht an den stdin Ihrer App zu senden, zB:

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

Natürlich bedeutet dies, müssen Sie ersinnen auf stdin in der Windows-Anwendung zu hören.

+0

Dank von allen Lösungen, scheint dies eine der besten! –

3

Sie können mit JNA versuchen, user32.dll importieren und definieren eine Schnittstelle, die mindestens CloseWindow

+0

+1 JNI vielleicht? Ich frage mich, ob es ein Dienstprogramm wie 'Kill-SIGTERM' in Windows – ATorras

1

Eine schmutzige Lösung wäre machen definiert Ihre MyWindowsApp seine Kennung wie Datei irgendwo registrieren und eine andere Windows-Anwendung zu erstellen, die WM_CLOSE sendet (nennen wir es MyWindowsAppCloser) zu anderen Anwendungen.

diese mit in der Hand, würden Sie folgendes mit 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

Nicht zu nativen Code ohne Rückgriff codieren. Process.destroy() verursacht eine erzwungene Beendigung. Unter Windows entspricht dies dem Aufruf TerminateProcess(). Unter Unix entspricht es einer SIGQUIT und verursacht die Anwendung auf Core-Dump.

+1

SIGKILL nicht Kern dump! Es ist nicht SIGQUIT (die Core standardmäßig ablegt). –

+0

Ich stehe korrigiert. Ich denke, Unix-Versionen von Java müssen ein SIGQUIT senden (Core-Dumps definitiv auftreten). Ich werde diese Antwort aktualisieren. Vielen Dank. –

3

Mit JNA der jna.jar und process.jar (von http://jna.java.net/) Sie eine WM_CLOSE-Nachricht senden, wie folgt:

int WM_CLOSE = 0x10; 

HWND hwnd = User32.INSTANCE.FindWindow(null, windowTitle); 
User32.INSTANCE.PostMessage(hwnd, WM_CLOSE, new WinDef.WPARAM(), new WinDef.LPARAM()); 
Verwandte Themen