c# - Send WM_CLOSE message to a process with no window -
एक प्रक्रिया शुरू कर रहा है -
ProcessStartInfo psi = new ProcessStartInfo ("G: \\ SampleWinApp ।प्रोग्राम फ़ाइल"); Psi.UseShellExecute = false; psi.CreateNoWindow = सच; प्रोसेस प्रो सीसी = प्रोसेस। स्टार्ट (पीएसआई); पोस्ट मेसेज का उपयोग कर भेजें
const int WM_CLOSE = 0x0010; सार्वजनिक शून्य SendCloseSignal (प्रक्रिया proc) {uint uiPid = (uint) proc.Id; Bool bResult = EnumWindows (नया WNDENUMPROC (EnumWindowsProc), uiPid); यदि (! bResult & amp; मार्शल.GetLastWin32Error () == 0) {वस्तु objWnd = processWind [uiPid]; अगर (objWnd! = नल) {IntPtr ptrWnd = (IntPtr) objWnd; पोस्ट मेसेज (पीटीआरडब्ल्यूडी, डब्लूएमसीएसीएड, 0, 0); वापसी; }} Foreach (proc.Threads में ProcessThread धागा) {PostThreadMessage (uint) thread.Id, WM_CLOSE, UIntPtr.Zero, IntPtr.Zero); }} निजी स्टेटिक बूल EnumWindowsProc (IntPtr hwnd, uint lParam) {uint uiPid = 0; अगर (GetParent (hwnd) == IntPtr.Zero) {GetWindowThreadProcessId (एचडब्ल्यूडी, रेफरी यूपीड); अगर (uiPid == lParam) {processWnd [uiPid] = hwnd; विवरण झूठा है; }} सच हो; } प्रारंभ करें CreateNoWindow = false के साथ, WM_CLOSE संदेश भेज रहा है और एप्लिकेशन को इनायत से बंद कर दिया गया है CreateNoWindow = true के साथ, WM_CLOSE संदेश कभी तक नहीं पहुंचता। यहां तक कि PostThreadMessage काम करने के लिए नहीं लगता है क्या WM_CLOSE संदेश भेजने का कोई तरीका है? मुझे कोई हल ढूंढने के लिए एक दिन की तलाश है .. कोई भाग्य नहीं। संपादित करें: प्रत्येक एप्लिकेशन के लिए एक विंडोज सर्विस स्थापित है सेवा शुरू / बंद करना शुरू / रोकता है अनुप्रयोग। वर्तमान में हम सर्विस स्टॉप पर आवेदन को मार देते हैं। चूंकि यह एक क्रूर बल मारता है, इसलिए अनुप्रयोगों को इनायत से मरना नहीं है। कुछ अनुप्रयोगों के लिए सुनो अब, मुझे इन एप्लिकेशनों के लिए WM_CLOSE संदेश भेजने के कुछ तरीके की आवश्यकता है संपादन 2: यदि कोई विंडो है, तो WM_CLOSE एक को चालू करता है लेकिन जब किसी भी प्रक्रिया को CreateNoWindow = true के साथ शुरू किया जाता है, तो यह कभी भी ट्रिगर नहीं होता है।
क्या कोई है WM_CLOSE संदेश भेजने का तरीका है?
WM_CLOSE को एक विंडो में भेजा जाता है। यदि इस प्रक्रिया में कोई खिड़की नहीं है, तो संदेश पर कार्रवाई करने के लिए कुछ भी नहीं है। यदि आप ऐसी कोई प्रक्रिया बंद करना चाहते हैं जिसमें कोई विंडो नहीं है, तो WM_CLOSE भेजना समाधान नहीं है। ऐसा लगता है कि आप केवल प्रक्रियाओं को मारना चाहते हैं और जब आप कंसोल प्रक्रियाओं से जुड़े हुए हैं, तो WM_CLOSE संदेशों को CTRL_CLOSE_EVENT संकेतों को ट्रिगर करने के लिए उपयोग कर रहे हैं चूंकि CTRL_CLOSE_EVENT पहले से ही एक प्रक्रिया को मारने का एक क्रूर तरीका है, तो आप इसे पूरी तरह से सही तरीके से समझ सकते हैं, मेरे विचार में, इसे मारने के लिए आपके पास पहले से ही एक प्रक्रिया वस्तु है बस इसे प्रक्रिया। Kill () । का उपयोग करके मार डालो, शायद आप जिस सवाल का वास्तव में पूछना चाहते थे, वह था:
मैं किसी अन्य प्रक्रिया में CTRL_CLOSE_EVENT कैसे संकेत कर सकता हूँ? एक संबंधित प्रश्न यहां मिल सकता है: मेरे विचार में सबसे अच्छा उत्तर है, स्वीकृत नहीं, यह है कि नीमो 1024 का अपने ब्लॉग आलेख के उस उत्तर के लिंक:
जैसा मैं समझता हूं, उस लेख में आपको आपकी समस्या को हल करने के लिए आवश्यक जानकारी देनी चाहिए। यह चार परिदृश्यों को सूचीबद्ध करता है पहले दो में शामिल होने के कारण WM_CLOSE बंद संकेत ट्रिगर करने के साधन के रूप में तीसरी प्रक्रिया को मारना है। और चौथा शायद आप के लिए क्या देख रहे हैं। बेशक यह चौथा विकल्प सबसे जटिल है इस आलेख से उद्धृत करने के लिए: इस सूत्र के नीचे एक संकेत खोजने के बाद, मैंने आखिरकार बुलेट को हटा दिया और एक विंडो के बिना प्रक्रिया शुरू की। जब कोई प्रक्रिया बंद करने के लिए समय आ जाता है, तो माता-पिता अपने कंसोल को बच्चे तक जोड़ते हैं, स्वयं को Ctrl-C घटना को सुनना बंद कर देता है और घटना को कंसोल में पेश करता है, ताकि संलग्न बच्चे समाप्त हो जाए यह तब खुद के लिए Ctrl-C हेन्डलर को दोबारा करता है और कंसोल को मुक्त करता है।
Comments
Post a Comment