2009-06-05 23 views

risposta

3

Si potrebbe utilizzare Process.getOutputStream per inviare un messaggio al stdin della vostra applicazione, ad esempio:

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

Naturalmente questo significa che bisogna escogitare per l'ascolto su stdin in app di Windows.

+0

Grazie, di tutte le soluzioni, questo sembra il migliore! –

3

si può provare con la JNA, importando user32.dll e definendo un'interfaccia che definisce almeno CloseWindow

+0

+1 JNI forse? Mi chiedo se c'è un'utilità come "kill -SIGTERM" in Windows – ATorras

1

Una soluzione sporca sarebbe rendere il vostro MyWindowsApp registrare il suo identificativo da qualche parte come di file e creare un'altra app finestre che invia WM_CLOSE (chiamiamolo MyWindowsAppCloser) ad altre applicazioni.

Con questo in mano, si sarebbe codificare il seguente utilizzando 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

Non senza ricorrere a codice nativo. Process.destroy() causa una chiusura forzata. Su Windows questo equivale a chiamare TerminateProcess(). Su Unix è equivalente a SIGQUIT e causa l'applicazione su core dump.

+1

SIGKILL non esegue il dump core! Non è SIGQUIT (che esegue il dump core di default). –

+0

Sono stato corretto. Suppongo che le versioni Unix di Java debbano inviare un SIGQUIT (i dump di base si verificano sicuramente). Aggiornerò questa risposta Grazie. –

3

Utilizzando jna.jar e process.jar di JNA (da http://jna.java.net/) si invia un messaggio WM_CLOSE come segue:

int WM_CLOSE = 0x10; 

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