यह एक असंभव कार्य की तरह लग रहा है। बिल्कुल कुछ भी मुझे काम नहीं मिला है। सवाल यह है कि प्रोसेस के साथ शुरू किए गए कंसोल एप्लिकेशन को कैसे बंद करना है। स्टार्ट जो कि कंसोल विंडो के साथ शुरू किया गया है और खोल निष्पादन के बिना: (ProcessStartInfo.CreateNoWindow = true; ProcessStartInfo.UseShellExecute = false;
)।प्रक्रिया के साथ शुरू किए गए कंसोल ऐप को कैसे बंद करें। स्टार्ट?
यह दिया गया है कि यदि एप्लिकेशन को ctrl-c या ctrl-break सिग्नल प्राप्त होता है तो इसे "साफ-सुथरा" बंद कर दिया जाएगा, लेकिन ऐसा लगता है कि यह काम करने वाला कोई तरीका नहीं है (विशेष रूप से GenerateConsoleCtrlEvent)।
- प्रक्रिया। किल काम नहीं करता है। यह प्रक्रिया की हत्या के कारण भ्रष्ट फ़ाइलों को पीछे छोड़ देता है।
- प्रक्रिया। CloseMainWindow काम नहीं करता है। इस मामले में कोई मुख्य विंडो नहीं है, इसलिए फ़ंक्शन झूठा लौटाता है और कुछ भी नहीं करता है।
- प्रक्रिया के लिए सभी थ्रेड पर EnumThreadWindows को कॉल करना और प्रत्येक विंडो में WM_CLOSE भेजना कुछ भी नहीं करता है, और वैसे भी कोई थ्रेड विंडो नहीं है।
- जेनरेट कंसोल CtrlEvent काम नहीं करता है। यह वही समूह में प्रक्रियाओं के लिए केवल उपयोगी है (जो .NET आपको कोई नियंत्रण नहीं देता है), वैसे भी कॉलिंग प्रक्रिया को बंद करने के अनचाहे दुष्प्रभाव के साथ। फ़ंक्शन आपको प्रक्रिया आईडी निर्दिष्ट करने की अनुमति नहीं देता है।
जो कोई भी "प्रक्रिया" ऑब्जेक्ट स्वीकार करता है जो उपरोक्त पैरामीटर के साथ शुरू किया गया है, जिसके परिणामस्वरूप कॉलिंग प्रक्रिया को प्रभावित किए बिना प्रारंभिक प्रक्रिया का एक साफ शटडाउन परिणाम के रूप में चिह्नित किया जाएगा। एक उदाहरण कंसोल ऐप के रूप में 7z.exe (7-ज़िप संग्रहकर्ता) का उपयोग करें, जो एक बड़ी फ़ाइल को संपीड़ित करना शुरू कर देता है, और स्पष्ट रूप से समाप्त नहीं होने पर भ्रष्ट, अधूरा फ़ाइल छोड़ देगा।
जब तक कोई कोई कार्यात्मक उदाहरण या कोड प्रदान नहीं करता है जो एक कार्यात्मक उदाहरण की ओर जाता है, तो यह प्रश्न अनुत्तरित नहीं है। मैंने इस सवाल और दर्जनों उत्तरों ऑनलाइन पूछने वाले दर्जनों लोगों को देखा है, और उनमें से कोई भी काम नहीं करता है। .NET अपनी प्रक्रिया आईडी को दिए गए कंसोल एप्लिकेशन को साफ़ करने के लिए कोई समर्थन प्रदान नहीं करता है, जो कि .NET प्रक्रिया ऑब्जेक्ट के साथ शुरू होने पर विचार कर रहा है। समस्या का एक हिस्सा एक नए प्रक्रिया समूह में एक प्रक्रिया बनाने में असमर्थता है, जो जेनरेट कंसोल CtrlEvent बेकार का उपयोग करता है। इसका समाधान होना चाहिए।
मेरे लिए ध्वनि सही समाधान की तरह 'है GenerateConsoleCtrlEvent'। इसलिए आपको यह समझने की जरूरत है कि नए समूह में प्रक्रिया कैसे बनाएं। यदि .NET प्रक्रिया रैपर का उपयोग करना संभव नहीं है, तो मूल Win32 फ़ंक्शन पर जाएं। पी/Invoke का उपयोग करने में कोई हानि नहीं है, आप इसे पहले से ही 'GenerateConsoleCtrlEvent' के लिए कर रहे हैं। –
मैं पहले से ही GenerateConsoleCtrlEvent का उपयोग नहीं कर रहा हूं (यह काम नहीं करता है), और मैं पी/Invoke का उपयोग नहीं करना चाहूंगा। CreateProcess द्वारा उपयोग की जाने वाली SECURITY_ATTRIBUTES संरचना में एक पॉइंटर होता है जिसके लिए मुझे 'असुरक्षित' के साथ संकलन करने की आवश्यकता होती है, जो मैं नहीं कर रहा हूं। CreateProcess के साथ एक और समस्या यह है कि मैं Process.EnableRaisingEvents और Exited Event विश्वसनीय रूप से उपयोग नहीं कर सकता, क्योंकि प्रक्रिया को कॉल करने का मौका मिलने से पहले प्रक्रिया समाप्त हो सकती है। GetProcessById हैंडलर असाइन करने के लिए .NET प्रक्रिया उदाहरण बनाने के लिए, जो आमतौर पर होगा प्रक्रिया कॉल करने से पहले किया गया। स्टार्ट। मुझे Win32 में अधिकांश तर्क फिर से लिखने के लिए मजबूर किया जा रहा है। – Triynko
और जैसा कि मैंने कहा, यह वैसे भी काम नहीं करता है। CREATE_NEW_PROCESS_GROUP के साथ प्रक्रिया बनाने के बावजूद, GenerateConsoleCtrlEvent का समूह पर कोई प्रभाव नहीं पड़ता है, जैसा कि प्रक्रिया आईडी द्वारा पहचाना गया है। मैंने CTRL + C के लिए निरंतर पारित करने का प्रयास किया, और फिर CTRL + BREAK, और न ही काम किया। साथ ही, CREATE_NEW_PROCESS_GROUP के साथ, मैंने CREATE_NO_WINDOW या DETACHED_PROCESS (अलग से, क्योंकि वे परस्पर अनन्य हैं) के लिए दोनों झंडे की कोशिश की, और दोनों एक कंसोल-कम प्रक्रिया प्राप्त करते हैं जो मेरे मुख्य एप्लिकेशन की कंसोल विंडो में हस्तक्षेप नहीं करता है, जेनरेट कंसोल कर्टलवेन्ट विधि काम नहीं करती है। – Triynko