2009-10-26 11 views
13

मेरा प्रोग्राम सिस्टम ट्रे में एक आइकन डालता है क्योंकि उपयोगकर्ता इसे कम कर सकता है। हालांकि, यदि एप्लिकेशन क्रैश हो जाता है, या मैं ऐप को VS में चलने से रोकता हूं तो यह आइकन तब तक छोड़ देता है जब तक कि मैं माउस के साथ उस पर होवर नहीं करता। कभी-कभी मैं वहां देखता हूं और 10 या तो आइकन होंगे।बाहर निकलने पर सिस्टम ट्रे में एक आइकन छोड़ने से कैसे रोकें?

क्या मैं यह सुनिश्चित कर सकता हूं कि आइकन दूर हो जाए?

उत्तर

21

कोई तरीका नहीं है यह करने के लिए। विंडोज यह देखने के लिए आपके प्रोग्राम को मतदान नहीं करता है कि यह अभी भी जिंदा है या नहीं। इसलिए, आपका आइकन सिस्टम ट्रे में तब तक रहेगा जब तक कि आप इसे छोड़ने के लिए कहें (सामान्य निकास), या उपयोगकर्ता ऐसा कुछ करता है जो आपके प्रोग्राम (जैसे माउसओवर) पर कॉल शुरू करता है। केवल तभी पता चलता है कि आपका प्रोग्राम मर गया है और इसे आपके आइकन को साफ करने की आवश्यकता है।

1) एक रूट संरचित अपवाद संचालक, जो बाहर निकलने से पहले आइकन के विनाश सुनिश्चित करता है लिखें:

+0

तो कार्यक्रम मरने के मामले में कोई घटना नहीं है जिसे मैं पकड़ सकता हूं? – Malfist

+0

नहीं, कोई घटना नहीं है। यह "सामान्य" व्यवहार है ... प्रत्येक ऐप जिसमें सिस्टम ट्रे आइकन होता है, जब यह असामान्य रूप से बाहर निकलता है तो उसके आइकन को पीछे छोड़ देता है। – jrista

+1

यह बहुत संभावना नहीं है कि आपको आइकन को साफ करने का अवसर नहीं मिलेगा। AppDomain.ProcessExit प्रक्रिया से बाहर निकलने के लिए सुनने के लिए एक बहुत अच्छी घटना है। जब तक आप पर्यावरण को कॉल नहीं करते हैं। फ़ेलफ़ास्ट() को इसे 'आपदाजनक' परिस्थितियों में भी बुलाया जाएगा –

3

बाहर निकलने से पहले, NotifyIcon दृश्यमान संपत्ति को झूठी पर सेट करें।

+1

लेकिन यह प्रोग्राम ठीक से बाहर निकलने पर इसे साफ़ करता है। लेकिन अगर कार्यक्रम मर जाता है, तो मार दिया जाता है, या दुर्घटनाओं से यह आइकन छोड़ देता है। – Malfist

+2

ऐसे व्यवहारों वाले उत्पादों की संख्या से निर्णय लेना, यह हल करने में एक कठिन समस्या है। –

+0

हालांकि यह सबसे अच्छा समाधान नहीं है लेकिन इसे तेजी से हल करने के लिए इसकी अच्छी चाल है! – Arash

3

ट्रे को छोड़ने के लिए आपको नोटिफ़िकॉन पर निपटान करने की आवश्यकता है।

संपादित करें: एक ऐसा कार्यक्रम है जिसे आप अपने Program.cs में जोड़ सकते हैं।

[STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 

आवेदन वर्ग में कुछ घटनाओं है आप को पता है का लाभ ले सकते है जब आपके एप्लिकेशन मर जाता है: सभी Windows ऐप्लिकेशन के लिए आपको कुछ इस तरह होगा

 Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 
     Application.ApplicationExit += new EventHandler(Application_ApplicationExit); 
+0

लेकिन कहां/कब? – Malfist

+1

ओपी का उल्लेख है कि वह केवल तब ही समस्या देखता है जब उसका आवेदन मर जाता है, या वह इसे मार देता है। उन स्थितियों में, निपटान() नहीं कहा जाएगा। –

4

आप कई विकल्प हैं। यह कुछ प्रयास करता है - लेकिन आप मूल रूप से अपने स्वयं के अनचाहे अपवाद हैंडलर को विंडोज़ में जोड़ सकते हैं जिसे "बूम" के कई रूपों के मामले में बुलाया जाएगा जो आपको कुछ आखिरी खाई को साफ करने का मौका देगा।

2) एक मॉनिटर एप्लिकेशन लिखें जो आपकी मुख्य प्रक्रियाओं को संभालने पर सोता है, और जब यह जागता है तो आइकन को मारता है (मुख्य आवेदन मर गया है)। इस बाद के परिदृश्य को अच्छी तरह से काम करने के लिए, आप शायद मुख्य प्रक्रिया को आइकन को मारने की इच्छा नहीं करेंगे - या आप मॉनिटर ऐप को बताने का एक तरीका बना सकते हैं कि इसे आइकन को नष्ट करने से बाहर निकलना चाहिए (मॉनिटर ऐप सोएं प्रक्रिया संभाल और एक नामित घटना दोनों पर - और अगर घटना से जागृत हो तो यह मुख्य ऐप के बाद सफाई/साफ हो जाता है)।

+0

डी ओह - मुझे भाषा का ध्यान रखना चाहिए था। विकल्प # 1 सी या सी ++ के लिए उपलब्ध है, लेकिन मुझे यकीन नहीं है कि सी # ऐप पर उपलब्ध है - इसलिए आपको # 2 करने के लिए मजबूर होना पड़ सकता है। – Mordachai

+0

# 2 वैसे भी अधिक मजबूत विकल्प है। टास्क मैनेजर में प्रक्रिया मारे गए या ओपी के रूप में उल्लिखित होने पर # 1 अच्छा नहीं होगा, अगर कोई अचानक डीबग सत्र समाप्त कर रहा था। –

-1

हम फॉर्म बंद होने से पहले ट्रे आइकन को छुपा सकते हैं। फॉर्मक्लोज़िंग इवेंट

NotifyIcon ni; 
... 
... 
private void MainForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    ni.Visible = false; 
} 
संबंधित मुद्दे