2009-06-05 8 views
8

एक जावा आवेदन में:जावा एप्लिकेशन में अच्छी तरह से प्रक्रिया को समाप्त करना संभव है?

currentProcess = Runtime.getRuntime().exec("MyWindowsApp.exe"); 
... 
currentProcess.destroy(); 

destroy कॉलिंग केवल प्रक्रिया को मारता है और किसी भी उपयोगकर्ता सफाई या बाहर निकलने के कोड को चलाने के लिए अनुमति नहीं है। क्या एक प्रक्रिया WM_CLOSE संदेश या इसी तरह की प्रक्रिया भेजना संभव है?

उत्तर

3

आप अपने एप्लिकेशन के stdin, जैसे के लिए एक संदेश भेजने के लिए Process.getOutputStream इस्तेमाल कर सकते हैं:

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

बेशक इसका मतलब आप Windows अनुप्रयोग में stdin पर सुनने के लिए ईजाद किया है।

+0

धन्यवाद, सब समाधान की, यह एक सबसे अच्छा लगता है! –

3

आप user32.dll आयात और एक अंतरफलक है कि परिभाषित करता है कम से कम CloseWindow

+0

+1 जेएनआई शायद? मुझे आश्चर्य है कि विंडोज – ATorras

1

एक गंदा समाधान अपने MyWindowsApp इसके पहचानकर्ता रजिस्टर कहीं फ़ाइल की तरह कर रही है हो सकता है और (WM_CLOSE भेजता है कि एक और खिड़कियों एप्लिकेशन बन जाएगा परिभाषित करने, 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() एक मजबूर समाप्ति का कारण बनता है। विंडोज़ पर यह TerminateProcess() पर कॉल करने के बराबर है। यूनिक्स पर यह SIGQUIT के बराबर है और एप्लिकेशन को कोर डंप करने का कारण बनता है।

+1

में 'मार-सिगरम' जैसी उपयोगिता है, सिगकिल कोर को डंप नहीं करता है! यह सिग्क्विट नहीं है (जो डिफ़ॉल्ट रूप से डंप कोर करता है)। –

+0

मैं सही खड़ा हूँ। मुझे लगता है कि जावा के यूनिक्स संस्करणों को एक सिग्क्विट भेजना होगा (कोर डंप निश्चित रूप से होते हैं)। मैं यह जवाब अपडेट करूंगा। धन्यवाद। –

3

(http://jna.java.net/ से) JNA के jna.jar और process.jar का उपयोग करते हुए इस प्रकार आप एक WM_CLOSE संदेश भेजने:

int WM_CLOSE = 0x10; 

HWND hwnd = User32.INSTANCE.FindWindow(null, windowTitle); 
User32.INSTANCE.PostMessage(hwnd, WM_CLOSE, new WinDef.WPARAM(), new WinDef.LPARAM()); 
संबंधित मुद्दे