2009-06-05 4 views

답변

3

당신은 당신의 응용 프로그램의 표준 입력, 예를 들어 메시지를 보낼 Process.getOutputStream을 사용할 수 물론 이것은 당신이 윈도우 응용 프로그램의 표준 입력을 수신하도록 고안해야한다는 것을 의미

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

.

+0

덕분에, 모든 솔루션이 하나가 가장 좋은 것 같습니다! –

3

당신은 USER32.DLL을 가져오고

+0

+1 JNI일까요? Windows에서 'kill -SIGTERM'과 같은 유틸리티가 있는지 궁금합니다. – ATorras

1

CloseWindow 적어도 더러운 솔루션이 MyWindowsApp 어딘가에 파일과 같은 식별자를 등록하게하고 (WM_CLOSE를 보내는 다른 Windows 응용 프로그램을 만들 것입니다 정의하는 인터페이스를 정의, JNA으로 시도 할 수 있습니다 MyWindowsAppCloser라고 함)를 다른 응용 프로그램에 보냅니다. 이 손으로

, 당신은 네이티브 코드에 의존하지 않고 다음 사용하여 자바 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

나는 고쳐졌다. 나는 유닉스 버전의 자바가 반드시 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()); 
관련 문제