2009-06-05 9 views

Respuesta

3

Usted podría utilizar Process.getOutputStream para enviar un mensaje a la entrada estándar de su aplicación, por ejemplo:

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

Por supuesto, esto significa que tiene que ingeniárselas para escuchar en la entrada estándar en la aplicación de Windows.

+0

Gracias, de todas las soluciones, éste parece el mejor! –

3

se puede tratar con JNA, importando user32.dll y que define una interfaz que define al menos CloseWindow

+0

+1 JNI tal vez? Me pregunto si hay una utilidad como 'kill -SIGTERM' en Windows – ATorras

1

Una solución sucia sería hacer su MiApWindows registra su identificador en algún lugar como archivo y crear otra aplicación de Windows que envía WM_CLOSE (vamos a llamarlo MyWindowsAppCloser) a otras aplicaciones.

Con esta disposición, usted podría codificar el siguiente usando 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

No sin recurrir a código nativo. Process.destroy() causa una terminación forzada. En Windows esto es equivalente a llamar al TerminateProcess(). En Unix es equivalente a SIGQUIT y hace que la aplicación se descargue al núcleo.

+1

¡SIGKILL no vacía el núcleo! No es SIGQUIT (que hace volcar core por defecto). –

+0

Estoy parado. Supongo que las versiones de Unix de Java deben enviar un SIGQUIT (definitivamente se producen volcados del núcleo). Actualizaré esta respuesta. Gracias. –

3

Usando jna.jar y process.jar del JNA (de http://jna.java.net/) envía un mensaje WM_CLOSE de la siguiente manera:

int WM_CLOSE = 0x10; 

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