2012-10-10 17 views
5

नहीं दिखाएगा मेरे पास एक छोटा सी # (.NET 4.0) कंसोल एप्लिकेशन है जो मैं चाहता हूं कि उपयोगकर्ता मेनू पर दिखाकर बातचीत करने में सक्षम हो सिस्टम ट्रे आइकन। मैं बिना किसी समस्या के ट्रे में एक आइकन जोड़ सकता हूं, लेकिन मैं मेनू को प्रकट नहीं कर सकता। मैं निम्नलिखित कोड का उपयोग कर रहा हूं:सी # कंसोल अनुप्रयोग के साथ सिस्टम ट्रे आइकन मेनू

NotifyIcon trayIcon = new NotifyIcon(); 
     trayIcon.Text = "TestApp"; 
     trayIcon.Icon = new Icon(SystemIcons.Application, 40, 40); 

     ContextMenu trayMenu = new ContextMenu(); 

     trayMenu.MenuItems.Add("Blah", item1_Click); 
     trayMenu.MenuItems.Add("Blah2", item1_Click); 
     trayMenu.MenuItems.Add("Blah3", item1_Click); 

     trayIcon.ContextMenu = trayMenu; 
     trayIcon.Visible = true; 

... जो ट्रे में आइकन डालता है। हालांकि, आइकन पर राइट-क्लिक करने से कुछ भी नहीं होता है। मैंने MenuItems.Add के विभिन्न क्रमपरिवर्तनों का प्रयास किया है, लेकिन कुछ भी मेनू दिखाई नहीं देगा। मुझे यकीन है कि मुझे कुछ आसान याद आ रहा है - कोई विचार क्या है?

उत्तर

7

आप आइकन बनाने के बाद इस जोड़ने का प्रयास करें:

Application.Run() 

ध्यान दें कि यह विधि नहीं लौटेगा, ताकि आप इसे बुला के बाद कुछ नहीं कर सकते। इसका मतलब है कि आपको अपने सभी अन्य कामों को एक अलग थ्रेड में करना होगा।

क्या होता है कि ओएस आपके एप्लिकेशन को यह संदेश भेजता है कि ट्रे आइकन सही क्लिक किया गया है, लेकिन ट्रे आइकन कोड इसे कभी नहीं देखता है (क्योंकि इन संदेशों को Application.Run द्वारा संसाधित किया जाता है) और इसलिए प्रतिक्रिया नहीं दे सकती मेनू खोलकर।

+1

छाँटे गए! वास्तविक कोड को दूसरे थ्रेड पर ले जाना काफी आसान होना चाहिए। धन्यवाद! – KenD

0

क्या आपने ट्रे आइकन माउस क्लिक के लिए ईवेंट-हैंडलर जोड़ा था?

trayIcon .MouseDown += new MouseEventHandler(trayIcon_MouseDown); 

संदर्भ मेनू बना सकते हैं और trayIcon_MouseDown समारोह

private void trayIcon_MouseDown (object sender,MouseEventArgs e) 
{ 
    //add you menu items to context menu 
    contextMenu.Items.Add(item); 
    contextMenu.IsOpen = true; 
} 

इस प्रयास करें अंदर निम्नलिखित के रूप में करते हैं। सोचो यह आपकी मदद करेगा।

6

मैंने सोचा कि मैं यहां साझा करूंगा ... किसी को आखिरकार एप्लिकेशन का उल्लेख करने के लिए कितना आशीर्वाद था। Run()। मैंने इसे समझने की कोशिश में बहुत लंबा रास्ता बिताया है। हालांकि, मैंने सोचा कि मैं साझा करता हूं कि अन्य सभी कोड को किसी अन्य थ्रेड में रखने का विकल्प मुख्य धागे के अलावा किसी थ्रेड पर NotifyIcon, मेनू, ईवेंट इत्यादि बनाना होगा। इसमें एप्लिकेशन.रुन() शामिल होना चाहिए क्योंकि यह मानक एप्लिकेशन संदेश लूप को वर्तमान थ्रेड पर काम करने की अनुमति देता है। तब से ही एक ही थ्रेड पर ईवेंट बनाए गए थे, इसलिए एप्लीकेशन.एक्सिट() का उपयोग अधिसूचना संदेश को बंद करने के लिए किया जा सकता है लेकिन फिर भी मुख्य थ्रेड जारी रखने की अनुमति देता है। यहाँ एक सांत्वना अनुप्रयोग के लिए एक छोटा सा उदाहरण है ... उम्मीद है कि इस कोई सोच रहा है कि वे कैसे इस पुल करने जा रहे थे मदद कर सकते हैं:

class Program 
{ 
    public static ContextMenu menu; 
    public static MenuItem mnuExit; 
    public static NotifyIcon notificationIcon; 

    static void Main(string[] args) 
    { 
     Thread notifyThread = new Thread(
      delegate() 
      { 
       menu = new ContextMenu(); 
       mnuExit = new MenuItem("Exit"); 
       menu.MenuItems.Add(0, mnuExit); 

       notificationIcon = new NotifyIcon() 
       { 
        Icon = Properties.Resources.Services, 
        ContextMenu = menu, 
        Text = "Main" 
       }; 
       mnuExit.Click += new EventHandler(mnuExit_Click); 

       notificationIcon.Visible = true; 
       Application.Run(); 
      } 
     ); 

     notifyThread.Start(); 

     Console.ReadLine();   
    } 

    static void mnuExit_Click(object sender, EventArgs e) 
    { 
     notificationIcon.Dispose(); 
     Application.Exit(); 
    } 

} 
+1

धन्यवाद @bjhuffine जिसने मदद की। मैं यहां तीन चीजें जोड़ना चाहता था अगर कोई कॉपी पेस्ट करके कोड का तुरंत परीक्षण करना चाहता है। 1) System.Windows.Forms dll और System.Drawing dll को संदर्भ जोड़ें। 2) उपरोक्त आइकन सेटिंग लाइन को आइकन = नया आइकन (SystemIcons.Aplication, 40, 40) में बदलें, 3) अपने कंसोल समाधान गुणों को अपडेट करें और इसे विंडोज फॉर्म के रूप में संकलित करें, यह सीधे अधिसूचना क्षेत्र में आता है। – sunder

+0

कम से कम ईवेंट प्राप्त करना संभव है, इसलिए कंसोल सिस्टम ट्रे पर जाता है? –

+0

'MediaTypeNames.Aplication.Run()' अपरिभाषित है, क्यों? –

1

यहाँ समाधान है: आप Application.Run() उपयोग करने के लिए है, क्योंकि कंसोल में जीयूआई की घटनाओं मोड काम नहीं कर रहा है। लेकिन आप इस समाधान का उपयोग कर सकते हैं:

System.Threading.Tasks.Task task = System.Threading.Tasks.Task.Factory.StartNew(() => ShowTrayIcon()); 

void ShowTrayIcon() 
{ 
    some code with tray icon ... 
} 

इस नए सूत्र में कोशिश आइकन के अपने स्थापना शुरू कर देंगे ...