मैं एक .NET विंडोज फॉर्म का आवेदन कैसे कर सकता हूं जो केवल सिस्टम ट्रे में चलता है?


216

सिस्टम ट्रे में Windows प्रपत्र अनुप्रयोग चलाने के लिए मुझे क्या करने की आवश्यकता है ?

ऐसा एप्लिकेशन नहीं जो ट्रे में कम से कम हो, लेकिन एक ट्रे में मौजूद है, जिसमें आइकन, टूल टिप और "राइट क्लिक" मेनू से अधिक कुछ नहीं है।



9
अधिकांश उत्तरों में कुछ गायब है - अपने एप्लिकेशन से बाहर निकलते समय icon.Visible = false, फिर Dispose()आइकन सेट करना न भूलें । अन्यथा आप अपने कार्यक्रम से बाहर निकलने के बाद भी आइकन देखेंगे। एक दो बार इसका परीक्षण करने के बाद, आपको पता नहीं चलेगा कि कौन सा आइकन वास्तविक है।
टॉमस गैंडर

यदि आप अधिक आधुनिक WPF दृष्टिकोण के बाद हैं - तो आप यह कोशिश कर सकते हैं: codeproject.com/Articles/36788/…
मरे फॉक्सक्रॉफ्ट

जवाबों:


85

कोड प्रोजेक्ट आलेख टास्करे एप्लीकेशन बनाना एक बहुत ही सरल विवरण देता है और एक एप्लीकेशन बनाने का उदाहरण है जो केवल सिस्टम ट्रे में मौजूद है।

मूल रूप से Application.Run(new Form1());लाइन को बदलने के Program.csबजाय एक ऐसा वर्ग शुरू करें जो विरासत में मिले ApplicationContext, और उस वर्ग के लिए कंस्ट्रक्टर ए को इनिशियलाइज़ करेंNotifyIcon

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Application.Run(new MyCustomApplicationContext());
    }
}


public class MyCustomApplicationContext : ApplicationContext
{
    private NotifyIcon trayIcon;

    public MyCustomApplicationContext ()
    {
        // Initialize Tray Icon
        trayIcon = new NotifyIcon()
        {
            Icon = Resources.AppIcon,
            ContextMenu = new ContextMenu(new MenuItem[] {
                new MenuItem("Exit", Exit)
            }),
            Visible = true
        };
    }

    void Exit(object sender, EventArgs e)
    {
        // Hide tray icon, otherwise it will remain shown until user mouses over it
        trayIcon.Visible = false;

        Application.Exit();
    }
}

13
यह एक शानदार शुरुआती बिंदु है। ध्यान दें कि "AppIcon" एक संसाधन का नाम होना चाहिए जिसे आप "प्रोजेक्ट -> गुण -> संसाधन -> संसाधन जोड़ें" के साथ जोड़ते हैं और फिर प्रोजेक्ट को फिर से जोड़ते हैं।
लवमंतिस

1
मैंने प्रॉपर्टीज..सर्स..डोर्स रिसोर्स..सिंक .. पुन: कंपाइल किया, अभी भी "एरर CS0103 मिलता है। 'रिसोर्स' नाम वर्तमान संदर्भ में मौजूद नहीं है"
बारलोप

@barlop मुझे इसे इस तरह लिखना था: Properites.Resources.AppIcon
साइमन

@SimonPerepelitsa धन्यवाद, मुझे यकीन नहीं है कि मैंने अपने प्रयोगों में क्या किया है, मेरा मतलब यह था कि मैंने क्या काम किया, लेकिन मैं कुछ ऐसी चीजों को भूल गया होगा जो मैंने किया था। लेकिन अंततः मैंने जिस विधि का उपयोग किया वह उन चीजों के पैलेट से एक नॉचटन आइकन को खींच रहा था जिन्हें आप खींच सकते हैं। फिर फॉर्म पर उस पर क्लिक करके, एक छोटे तीर पर क्लिक करें जो इसके लिए एक आइकन चुनने के लिए एक मेनू लाता है!
बार्लोप

17

जैसा कि mat1t कहता है - आपको अपने आवेदन में एक NotifyIcon जोड़ने की आवश्यकता है और फिर टूलटिप और संदर्भ मेनू सेट करने के लिए निम्न कोड की तरह कुछ का उपयोग करें:

this.notifyIcon.Text = "This is the tooltip";
this.notifyIcon.ContextMenu = new ContextMenu();
this.notifyIcon.ContextMenu.MenuItems.Add(new MenuItem("Option 1", new EventHandler(handler_method)));

यह कोड केवल सिस्टम ट्रे में आइकन दिखाता है:

this.notifyIcon.Visible = true;  // Shows the notify icon in the system tray

यदि आपके पास एक फॉर्म (जो भी कारण हो) के लिए निम्नलिखित की आवश्यकता होगी:

this.ShowInTaskbar = false;  // Removes the application from the taskbar
Hide();

संदर्भ मेनू प्राप्त करने के लिए राइट क्लिक स्वचालित रूप से नियंत्रित किया जाता है, लेकिन यदि आप बाएं क्लिक पर कुछ कार्रवाई करना चाहते हैं, तो आपको एक क्लिक हैंडलर जोड़ने की आवश्यकता होगी:

    private void notifyIcon_Click(object sender, EventArgs e)
    {
        var eventArgs = e as MouseEventArgs;
        switch (eventArgs.Button)
        {
            // Left click to reactivate
            case MouseButtons.Left:
                // Do your stuff
                break;
        }
    }

15

मैंने .NET 1.1 के साथ एक ट्रेबार ऐप लिखा है और मुझे फॉर्म की आवश्यकता नहीं थी।
सबसे पहले Main, एक मॉड्यूल में परिभाषित उप के रूप में परियोजना के स्टार्टअप ऑब्जेक्ट को सेट करें ।
तो प्रोग्राम के रूप में घटक बनाने के लिए: NotifyIconऔर ContextMenu
एक MenuItem"छोड़ो" या समान शामिल करना सुनिश्चित करें ।
बाँध ContextMenuके लिए NotifyIcon
आह्वान किया Application.Run()
छोड़ो के लिए ईवेंट हैंडलर में MenuItemहोना सुनिश्चित करें कि कॉल करने के लिए सेट NotifyIcon.Visible = Falseहै, तो Application.Exit()। आपको जो भी चाहिए उसे ContextMenuठीक से जोड़ें और संभाल लें :)


11
  1. विज़ार्ड के साथ एक नया विंडोज एप्लिकेशन बनाएं।
  2. Form1कोड से हटाएं ।
  3. Program.cs में कोड निकालें Form1
  4. NotifyIconअपने सिस्टम ट्रे आइकन बनाने के लिए कक्षा का उपयोग करें (इसे एक आइकन असाइन करें)।
  5. इसमें एक संदर्भ पत्र जोड़ें।
  6. या फिर NotifyIconराईट और लेफ्ट क्लिक के बीच मूसलीक और डिफरेंशियल पर रिएक्ट करें, अपने रेफरेंस को सेट करें और उसे दिखाए जिसके लिए कभी बटन (राइट / लेफ्ट) दबाया गया था।
  7. Application.Run()एप Application.Exit()को छोड़ने के लिए चालू रखें । या ए bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}। फिर bRunning = false;ऐप से बाहर निकलने के लिए सेट करें।

जब आप मुख्य के अंत तक पहुँचते हैं और कोई UI थ्रेड नहीं है, तो प्रोग्राम निष्पादित करना बंद कर देता है। आप इस बात का ध्यान कैसे रखते हैं कि आपका समाधान क्या है? अगर आपने उन समस्याओं को हल कर लिया है तो आप मेरा वोट
पाएं

आप मेरा वोट पाइए। शायद सिर्फ उल्लेख है कि आपको अभी भी किसी भी परम के बिना Application.Run को कॉल करने की आवश्यकता है?

App.Run के विकल्प के साथ अद्यतन किया गया।
वुल्फ ५

The थ्रेड। स्लीप ओवरकिल है मुझे पता है, लेकिन अगर आपके पास अनुप्रयोग के लिए एक बेहतर "नींद" लूप विकल्प है। क्या यह पोस्ट करें :)
वोल्फ 5

Thread.Sleep एक बुरा विचार है: यदि आपने अभी-अभी ApplicationRun किया है, तो आप अधिक CPU और बैटरी का उपयोग करेंगे।
स्नेफेल

8

"सिस्टम ट्रे" आवेदन सिर्फ एक नियमित रूप से जीतता है आवेदन, केवल अंतर यह है कि यह विंडोज़ सिस्टम ट्रे क्षेत्र में एक आइकन बनाता है। Sys.tray आइकन उपयोग NotifyIcon घटक बनाने के लिए, आप इसे टूलबॉक्स (सामान्य नियंत्रण) में पा सकते हैं, और इसके गुणों को संशोधित कर सकते हैं: चिह्न, टूल टिप। इसके अलावा यह आपको माउस क्लिक और डबल क्लिक संदेशों को संभालने में सक्षम बनाता है।

और एक और बात, देखो और लगता है या मानक ट्रे एप्लिकेशन को प्राप्त करने के लिए। अपने मुख्य फॉर्म शो ईवेंट पर फॉलोइनफ लाइनें जोड़ें:

private void MainForm_Shown(object sender, EventArgs e)
{
    WindowState = FormWindowState.Minimized;
    Hide();
} 

6

जहां तक ​​मैं जानता हूं कि आपको अभी भी एक फॉर्म का उपयोग करके एप्लिकेशन लिखना है, लेकिन फॉर्म पर कोई नियंत्रण नहीं है और इसे कभी भी दिखाई नहीं देता है। अपने आवेदन को लिखने के लिए NotifyIcon (एक MSDN नमूना, जो यहां पाया जा सकता है ) का उपयोग करें।


1
काफी नहीं। आपके फ़ॉर्म में नियंत्रण शामिल हो सकते हैं, लेकिन इसे डिफ़ॉल्ट रूप से छिपाया जाना चाहिए।
रूण ग्रिमस्टैड

5
आपको किसी भी रूप की आवश्यकता नहीं है। एक नए विंडो ऐप निर्माण विज़ार्ड के बाद, बस फॉर्म 1 को हटा दें और इसे खोलने वाले कोड को हटा दें। आप यह सब उस पर NotifyIcon और ContextMenu के साथ Program.cs से लिख सकते हैं। ज्यादा कुछ नहीं चाहिए।
वुल्फ 5

1
मुझे पता है कि इसमें नियंत्रण शामिल हो सकता है, लेकिन ओपी यह नहीं चाहता है
मैथ्यू स्टील

2

यहाँ मैंने इसे Visual Studio 2010 , .NET 4 के साथ कैसे किया

  1. एक Windows प्रपत्र अनुप्रयोग बनाएँ, गुणों में 'एकल आवृत्ति अनुप्रयोग बनाएँ' सेट करें
  2. एक ContextMenuStrip जोड़ें
  3. संदर्भ मेनू पट्टी में कुछ प्रविष्टियां जोड़ें, हैंडलर प्राप्त करने के लिए उन पर डबल क्लिक करें, उदाहरण के लिए, 'बाहर निकलें' (डबल क्लिक) -> हैंडलर -> me.Close ()
  4. डिज़ाइनर सेट के संदर्भ में एक NotifyIcon जोड़ें, जो आपने अभी बनाया है, उसके लिए मेन्यूस्ट्रिप करें, एक आइकन चुनें (आप 'common7 ...' के तहत VisualStudio फ़ोल्डर में कुछ पा सकते हैं)
  5. डिज़ाइनर में फ़ॉर्म के लिए गुण सेट करें: FormBorderStyle: कोई नहीं, ShowIcon: false, ShowInTaskbar: false, Opacity: 0%, WindowState: Minimized
  6. Form1_Load के अंत में Me.V अदृश्य = गलत जोड़ें, यह उपयोग करते समय आइकन छिपाएगा Ctrl +Tab
  7. आवश्यकतानुसार चलाएं और समायोजित करें।

2

यह नोटिफिकेशन एरिया एप्लिकेशन के लिए बहुत ही अनुकूल फ्रेमवर्क है ... यह नोटिफिकेशन को आधार फॉर्म में जोड़ने और कोड जनरेट करने के लिए ऑटो-जनरेट कोड बदलने के लिए पर्याप्त है:

public partial class Form1 : Form
{
    private bool hidden = false;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.ShowInTaskbar = false;
        //this.WindowState = FormWindowState.Minimized;
        this.Hide();
        hidden = true;
    }

    private void notifyIcon1_Click(object sender, EventArgs e)
    {
        if (hidden) // this.WindowState == FormWindowState.Minimized)
        {
            // this.WindowState = FormWindowState.Normal;
            this.Show();
            hidden = false;
        }
        else
        {
            // this.WindowState = FormWindowState.Minimized;
            this.Hide();
            hidden = true;
        }
    }
}

-2

सीधे शब्दों में कहें

this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;

आपके फॉर्म ऑब्जेक्ट को। आपको सिस्टम ट्रे में केवल एक आइकन दिखाई देगा।


यह टास्कबार के ऊपर फॉर्म डालता है । एक ही बात नहीं है। क्या आप किसी अन्य पोस्ट पर प्रतिक्रिया देने का प्रयास कर रहे हैं?
लार्सटेक

1
टास्कबार पर एक आइकन नहीं है, हम फ़ॉर्म नहीं देखते हैं। नेत्रहीन कार्यक्रम केवल सिस्टम ट्रे में मौजूद है। ऊपर का क्या मतलब है?
यरेल

आपके उत्तर में कोई संदर्भ नहीं है। क्या आप NotifyIcon क्लास का उपयोग कर रहे हैं? यदि नहीं, तो आपका फॉर्म केवल टास्क बार के नीचे बाएँ कोने में है।
लार्सटेक

1
यदि आप व्यस्त नहीं हैं, तो कृपया इसे लिखने और चलाने का प्रयास करें।
यूलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.