मेरे पास मेरे आवेदन के लिए एक विंडो सेवा है। जब मैं कार्य प्रबंधक के साथ प्रक्रिया को मार कर रोकता हूं, ट्रे आइकन गायब नहीं होता है। क्या यह एक खिड़की की बग है या कुछ और? क्या हमारे पास उस समस्या का समाधान है? अग्रिम में धन्यवाद :)।ट्रे आइकन हत्या प्रक्रिया पर गायब नहीं होता
उत्तर
इस समस्या का कोई समाधान नहीं है। यदि आप कार्य प्रबंधक के साथ प्रक्रिया को मार देते हैं, तो इसे समाप्ति अधिसूचना नहीं मिलती है, और इसलिए ट्रे से अपना आइकन नहीं हटाया जा सकता है। इस तरह हत्या प्रक्रिया से बचने का प्रयास करें। आप सेवा को मारने के लिए net start/stop
का उपयोग कर सकते हैं या services.msc
GUI।
आइकन पर अपने माउस को ले जाएं, और यह गायब हो जाएगा। मैंने विंडोज 7 के सभी संस्करणों में यह व्यवहार देखा है, जिसमें Win 7.
मुझे अक्सर विभिन्न अनुप्रयोगों के साथ भी ध्यान दिया जाता है। एप्लिकेशन की मौत केवल तभी देखी जाती है जब आप माउस को आइकन पर ले जाते हैं।
मुझे लगता है कि "बग" विंडोज के साथ है, न कि आपके आवेदन। (मैं इसे "बग" कहने के लिए अनिच्छुक हूं, क्योंकि यह शायद इसे छोड़ने का एक सचेत निर्णय था। एक्सप्लोरर यह जांच सकता था कि पंजीकृत आइकन जो एप्लिकेशन अभी भी चल रहे हैं, लेकिन यह बहुत महंगा हो सकता है।)
आप निर्दिष्ट NotifyIcon-object के निपटान() - विधि को कॉल करके आइकन गायब होने दे सकते हैं। ज्यादातर मामलों में ये कंटेनर-ऑब्जेक्ट आपके आवेदन में घटकों के पेड़ का हिस्सा नहीं है, इसलिए यह प्रोसेस को मारकर गायब नहीं होगा। जब उपयोगकर्ता आइकन पर चलता है, तो आइकन को यह पैरेंट नहीं मिलता है, इसलिए यह गायब हो जाता है। लेकिन निपटान-विधि को बुलाकर, यह कम से कम मेरे अनुप्रयोगों में निराश हो गया। तो:
//creating a NotifyIcon
NotifyIcon notifyicon = new NotifyIcon();
notifyicon.Text = "Text";
notifyicon.Visible = true;
notifyicon.Icon = new Icon(GetType(),"Icon.ico");
//let it disappear
notifyicon.Dispose();
धन्यवाद, यह अच्छा लगता है लेकिन मुझे नहीं पता कि यह कोड कहां रखा जाए। यह बहुत अच्छा होगा अगर आप इसके साथ मेरी मदद कर सकते हैं। – Lalit
मुझे लगता है कि आपको एक विधि परिभाषित करनी चाहिए ताकि जब आपका एप्लिकेशन छोड़ देता है तो वह विधि कॉल करेगा। तो अगर यह एक विंडो अनुप्रयोग है (एक रूप के साथ)। मुझे लगता है कि आप उचित रूप से विधि का उपयोग करेंगे। रुन (yourForm); फॉर्म बंद होने के बाद, विधि पूरी हो गई है, इसलिए मुख्य विधि आगे बढ़ेगी। यदि आपने अपने मुख्य श्रेणी में अधिसूचना आइकन परिभाषित किया है तो आप रन-विधि के बाद इसे डिस्पियर कर सकते हैं। लेकिन निश्चित रूप से मैं सामान्य रूप से सवाल का जवाब नहीं दे सकता। आपको एक थ्रेड ढूंढना होगा जो आपके आवेदन को समाप्त करते समय काम करता है। –
संपादित करें (मैंने आपका प्रश्न दोबारा पढ़ा है): यदि आप प्रक्रिया में एक विधि जोड़ते हैं। विस्तारित घटना और वह तरीका नौकरी करता है, मुझे लगता है कि इसे काम करना चाहिए, लेकिन मैंने अभी तक इसका परीक्षण नहीं किया है। शुभकामनाएं –
एक आवेदन जबरदस्ती (कार्य प्रबंधक के माध्यम से जैसे) समाप्त होने पर, फिर Windows सूचना आइकन को दूर नहीं करता। विंडोज एक्सप्लोरर यह भी ध्यान नहीं देता है कि जब तक यह अधिसूचना आइकन का मालिक नहीं है, तब तक यह संदेश तब तक चला गया है जब तक यह एक संदेश (आमतौर पर एक माउस मूवमेंट संदेश) भेजने की कोशिश करता है। उस समय, विंडोज अधिसूचना क्षेत्र से अब मृत आइकन हटा देगा।
यह देखते हुए कि आप can't intercept TerminateProcess, ऐसा कुछ भी नहीं है जो आपका प्रोग्राम स्वयं ही इसके बारे में कर सके।
मुझे लगता है कि विंडोज एक्सप्लोरर मालिक विंडो को नष्ट करने के लिए देख सकता है (जैसे कि एप्लिकेशन अप्रत्याशित रूप से बाहर निकलता है), लेकिन ऐसा नहीं होता है।
भले ही एप्लिकेशन को बंद कर दिया गया हो, फिर भी इसे अपने किसी भी अधिसूचना आइकन को हटाना याद रखना चाहिए। यही है: यदि आप Shell_NotifyIcon(NIM_DELETE)
(NotifyIcon.Dispose
के समतुल्य) को कॉल नहीं करते हैं, तो जब आपका एप्लिकेशन बंद हो जाता है (यहां तक कि कृपापूर्वक), तब तक आइकन तब तक रहेगा जब तक माउस उस पर आगे नहीं बढ़ता।
ओह, और यदि यह एक सेवा प्रक्रिया है जो अधिसूचना आइकन प्रदर्शित कर रही है, तो ध्यान रखें कि Windows Vista और Windows 7 में सत्र 0 अलगाव इसे तोड़ देगा।
मैंने ThreadException ईवेंट को संभालने और उस ईवेंट हैंडलर में ट्रे आइकन का निपटारा करके इसे किया है।
अरे, नियंत्रण प्रक्रिया पर थ्रेडएक्सप्शन पर नियंत्रण नहीं चल रहा है, इसलिए यह काम नहीं करेगा :( – Lalit
@lalit अच्छी तरह से, यदि आप वास्तव में एक सेवा का उपयोग कर रहे हैं (यानी, सर्विसबेस बढ़ाता है), आप निपटान विधि को ओवरराइड कर सकते हैं। यह सब इस बात पर निर्भर करता है कि आपके पास किस प्रकार का एप्लिकेशन है और जहां ट्रे आइकन बनाया गया है। – Will
@ ललित हम्म .... क्या आप असली सेवा का उपयोग कर रहे हैं? (जैसा कि, सर्विसबेस बढ़ाता है)? आपको यह बताना मुश्किल है कि क्या करना है और कहां है क्योंकि हम नहीं जानते * बिल्कुल * आप किस प्रकार का ऐप विकसित कर रहे हैं और आप ट्रेकॉन का निर्माण कैसे कर रहे हैं और आप इसे कहां संग्रहीत कर रहे हैं। कोड निश्चित रूप से मदद करेगा। यदि आप वास्तव में एक सेवा का उपयोग कर रहे हैं और आप अपनी सेवा कक्षा में ट्रेएकॉन बनाते हैं (मुझे यकीन नहीं है कि यह भी संभव है) तो आप ट्रेकॉन को 'this.components' संग्रह में छोड़ सकते हैं और सेवा का निपटारा होने पर इसका निपटारा किया जाएगा निपटाए। लेकिन मुझे यकीन नहीं है कि अगर आप इसे कैसे कर रहे हैं, तो कोड प्राप्त करें। – Will
इस उपकरण http://www.codeproject.com/Articles/19620/LP-TrayIconBuster
यह ToolBarButtons के माध्यम से TrayNotifyWnd में & NotifyIconOverflowWindow iterates और अशक्त फ़ाइल नाम के साथ उन लोगों को हटा का प्रयोग करें।
मैंने इसे भी देखा है :) –
हाँ यह काम करता है लेकिन मुझे इसे कोड द्वारा गायब करना है।मेरा मतलब है कि कुछ स्क्रिप्ट है मेरी परीक्षण टीम उस सेवा को रोकने के लिए चल रही है और मुझे लगता है कि वे वास्तव में सेवा को छोड़ने की बजाय प्रक्रिया को मार रहे हैं। मुझे उनके लिए एक समाधान खोजना है (आप परीक्षण लड़कों को जानते हैं: डी)। – Lalit
यह बिल्कुल एक फिक्स नहीं है। एक गंदे गंदी हैक की तरह। – Will