Каков правильный способ минимизировать лоток для приложения c# WinForms?


Что такое правильный способ, чтобы свести к минимуму приложение приложения WinForms в трей?

Примечание: уменьшить до трее; на правой стороне панели задач часы. Я не спрашиваю о минимизации панели задач, что происходит, когда вы нажимаете кнопку "минус" в окне.

Я видел хакерские решения, такие как " минимизировать, установить ShowInTaskbar = false, а затем показать свой NotifyIcon."

такие решения являются хакерскими, потому что приложение не похоже на минимизацию в трее, как и другие приложения, код должен определить, когда установить ShowInTaskbar = true, среди других проблем.

Как правильно это сделать?

8 59

8 ответов:

на самом деле нет управляемого способа сделать эту форму анимации в трее в собственных winforms, однако вы можете P/Invoke shell32.dll для этого:

хорошая информация здесь (в комментариях не пост):

http://blogs.msdn.com/jfoscoding/archive/2005/10/20/483300.aspx

и вот он в C++:

http://www.codeproject.com/KB/shell/minimizetotray.aspx

вы можете использовать это, чтобы выяснить какой материал для Pinvoke для вашей версии C#.

this.WindowState = FormWindowState.Minimized  

это встроенный способ сделать это, и это выглядит нормально для меня большую часть времени. Единственное время имеет некоторую странность, если вы вызываете его при запуске, который иногда имеет некоторую странность, поэтому большинство людей также установят ShowInTaskbar = false и тоже скроют форму.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.windowstate.aspx

Это помогает,

 public partial class Form1 : Form
    {
        public static bool Close = false;
        Icon[] images;
        int offset = 0;


        public Form1()
        {
            InitializeComponent();

            notifyIcon1.BalloonTipText = "My application still working...";
            notifyIcon1.BalloonTipTitle = "My Sample Application";
            notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; 
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            if (FormWindowState.Minimized == WindowState)
            {
                this.Hide();
                notifyIcon1.ShowBalloonTip(500);
                //WindowState = FormWindowState.Minimized;
            }


        }

        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.Show();
            notifyIcon1.ShowBalloonTip(1000);
            WindowState = FormWindowState.Normal;

        }

        private void maximizeToolStripMenuItem_Click(object sender, EventArgs e)
        {

            this.Show();
            WindowState = FormWindowState.Normal;
        }

        private void closeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close = true;
            this.Close();  
        }



        // Handle Closing of the Form.
        protected override void OnClosing(CancelEventArgs e)
        {
            if (Close)
            {
                e.Cancel = false;
            }
            else
            {

                WindowState = FormWindowState.Minimized;
                e.Cancel = true;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Load the basic set of eight icons.
            images = new Icon[5];
            images[0] = new Icon("C:\icon1.ico");
            images[1] = new Icon("C:\icon2.ico");
            images[2] = new Icon("C:\icon3.ico");
            images[3] = new Icon("C:\icon4.ico");
            images[4] = new Icon("C:\icon5.ico");
        }


        private void timer1_Tick(object sender, EventArgs e)
        {
            // Change the icon.
            // This event handler fires once every second (1000 ms).
            if (offset < 5)
            {
                notifyIcon1.Icon = images[offset];
                offset++;
            }
            else
            {
                offset = 0;
            }
        }

    }

этот код протестирован и поддерживает множество опций.

подробнее здесь:http://code.msdn.microsoft.com/TheNotifyIconExample

обновление: похоже, я слишком рано выложили. Я также использовал ниже хак для моего инструмента. Ждем правильного решения для этого..........

вы можете использовать Windows.Формы.NotifyIcon для этого. http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx

добавьте NotifyIcon в форму, установите некоторые свойства, и все готово.

        this.ShowIcon = false;//for the main form
        this.ShowInTaskbar = false;//for the main form
        this.notifyIcon1.Visible = true;//for notify icon
        this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));//set an icon for notifyicon

    private void Form1_Shown(object sender, EventArgs e)
    {
        this.Hide();
    }

аналогично, как и выше...

У меня есть обработчик событий изменения размера, который запускается всякий раз, когда окно изменяется (максимизируется, минимизируется и т. д.)...

    public form1()
    {
       Initialize Component();

       this.Resize += new EventHanlder(form1_Resize);
    } 


    private void form1_Resize(object sender, EventArgs e)
    {
       if (this.WindowState == FormWindowState.Minimized && minimizeToTrayToolStripMenuItem.Checked == true)
       {
             NotificationIcon1.Visible = true;
             NotificationIcon1.BalloonTipText = "Tool Tip Text"
             NotificationIcon1.ShowBalloonTip(2);  //show balloon tip for 2 seconds
             NotificationIcon1.Text = "Balloon Text that shows when minimized to tray for 2 seconds";
             this.WindowState = FormWindowState.Minimized;
             this.ShowInTaskbar = false;
       }
    }

это позволяет пользователю выбрать, хотят ли они свернуть в лоток через строку меню. Они могут перейти в Windows - > и нажать кнопку Свернуть в лоток. Если это проверено, и окно изменяется до минимума, а затем оно будет свернуто в лоток. Работает безупречно для меня.

в конструкторе вида:

this.Resize += new EventHandler(MainForm_Minimize);

затем используйте этот метод обработчика событий:

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

Если у вас возникли проблемы с получением этой работы, проверьте, что у вас есть

this.Resize += new System.EventHandler(this.Form1_Resize);

в fom1.дизайнер.cs