मुझे लगता है कि मैं इस सवाल पर देर से एक सा कर रहा हूँ, लेकिन मैं एक ही समस्या हो रही किसी के लिए वैसे भी कुछ लिखेंगे। यह वही जवाब है जैसा मैंने this प्रश्न दिया था।
मेरी समस्या यह थी कि मैं अपने आवेदन को जीयूआई एप्लीकेशन बनना चाहता हूं लेकिन निष्पादित प्रक्रियाओं को बिना किसी इंटरैक्टिव कंसोल विंडो के पृष्ठभूमि में चलाया जाना चाहिए। मुझे लगता है कि जब यह प्रक्रिया एक कंसोल प्रक्रिया है तो यह समाधान भी काम करना चाहिए। हालांकि आपको "CREATE_NO_WINDOW" ध्वज को हटाना पड़ सकता है।
मैं एक रैपर ऐप के साथ GenerateConsoleCtrlEvent() का उपयोग करके इसे हल करने में कामयाब रहा। मुश्किल हिस्सा यह है कि दस्तावेज़ीकरण वास्तव में स्पष्ट नहीं है कि इसका उपयोग कैसे किया जा सकता है और इसके साथ नुकसान।
मेरा समाधान here का वर्णन करने पर आधारित है। लेकिन इससे वास्तव में सभी विवरणों को और त्रुटि के साथ समझाया नहीं गया था, इसलिए यहां काम करने के तरीके के बारे में विवरण दिया गया है।
एक नया सहायक एप्लिकेशन "Helper.exe" बनाएं। यह एप्लिकेशन आपके एप्लिकेशन (अभिभावक) और उस बच्चे की प्रक्रिया के बीच बैठेगा जिसे आप बंद करना चाहते हैं। यह वास्तविक बाल प्रक्रिया भी बनाएगा। आपके पास यह "मध्य व्यक्ति" प्रक्रिया होनी चाहिए या जेनरेट कंसोलक्यूटरइवेंट() विफल हो जाएगी।
माता-पिता से सहायक प्रक्रिया में संवाद करने के लिए किसी प्रकार की आईपीसी तंत्र का उपयोग करें कि सहायक को बाल प्रक्रिया को बंद करना चाहिए। जब सहायक को यह ईवेंट मिलता है तो यह "GenerateConsoleCtrlEvent (CTRL_BREAK, 0)" कहता है जो स्वयं और बच्चे की प्रक्रिया को बंद कर देता है। मैंने इस घटना के लिए एक इवेंट ऑब्जेक्ट का इस्तेमाल किया जो माता-पिता को पूरा करता है जब वह बाल प्रक्रिया को रद्द करना चाहता है।
अपने Helper.exe को बनाने के लिए इसे CREATE_NO_WINDOW और CREATE_NEW_PROCESS_GROUP के साथ बनाएं। और जब बच्चे की प्रक्रिया बनाते हैं तो इसे कोई झंडे (0) के साथ बनाते हैं जिसका अर्थ है कि यह कंसोल को अपने माता-पिता से प्राप्त करेगा। ऐसा करने में विफल होने से यह घटना को अनदेखा कर देगा।
यह बहुत महत्वपूर्ण है कि प्रत्येक चरण इस तरह किया जाता है। मैं सभी अलग-अलग प्रकार के संयोजनों की कोशिश कर रहा हूं लेकिन यह संयोजन एकमात्र ऐसा काम करता है जो काम करता है। आप CTRL_C ईवेंट नहीं भेज सकते हैं। यह सफलता वापस कर देगा लेकिन प्रक्रिया से अनदेखा कर दिया जाएगा। CTRL_BREAK एकमात्र ऐसा काम करता है जो काम करता है। वास्तव में कोई फर्क नहीं पड़ता क्योंकि वे दोनों अंत में ExitProcess() को कॉल करेंगे।
आप जेनरेट कंसोलकूटइवेंट() को बाल प्रक्रिया आईडी की एक प्रक्रिया समूह आईडी के साथ भी कॉल नहीं कर सकते हैं, जिससे सहायक प्रक्रिया को सीधे जारी रखने की इजाजत मिलती है। यह भी असफल हो जाएगा।
मैंने पूरे दिन इस काम को पाने की कोशिश की। यह समाधान मेरे लिए काम करता है लेकिन अगर किसी को जोड़ने के लिए कुछ और है तो कृपया करें। मैं पूरी तरह से समस्याओं के साथ बहुत सारे लोगों को खोजने के लिए गया लेकिन समस्या का कोई निश्चित समाधान नहीं था। कैसे उत्पन्न करें CononCtrlEvent() काम भी थोड़ा अजीब है, इसलिए यदि कोई इस पर अधिक जानकारी जानता है तो कृपया साझा करें।
मैं जावा सेवा प्रक्रियाओं के लिए Ctrl-C भेजने सिर्फ threaddumps प्राप्त करने के लिए में रुचि थी के रूप में CtrlCSender चलाता है। ऐसा लगता है कि इस विशिष्ट मामले के लिए 'jstack' का विश्वसनीय रूप से उपयोग किया जा सकता है: https://stackoverflow.com/a/47723393/603516 – Vadzim