Как правильно свернуть приложение WinForms на C #? - PullRequest
60 голосов
/ 06 сентября 2008

Как правильно свернуть приложение WinForms в системный трей?

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

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

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

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

Ответы [ 8 ]

18 голосов
/ 06 сентября 2008

На самом деле нет никакого управляемого способа сделать эту форму анимации в трее в родных 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 #.

8 голосов
/ 06 сентября 2008
this.WindowState = FormWindowState.Minimized  

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

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

5 голосов
/ 18 августа 2010

Поможет:

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;
        }
    }
}
4 голосов
/ 29 декабря 2008

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

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

3 голосов
/ 06 сентября 2008

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

Для этого вы можете использовать Windows.Forms.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();
    }
1 голос
/ 10 февраля 2009

Как и выше ...

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

    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 -> и щелкнуть «Свернуть в лоток». Если это проверено, и размер окна будет уменьшен до Минимизировано, тогда оно будет свернуто в трей. У меня работает без нареканий.

0 голосов
/ 03 августа 2010

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

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

в fom1.designer.cs

0 голосов
/ 06 февраля 2009

В конструкторе формы:

this.Resize += new EventHandler(MainForm_Minimize);

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

    private void MainForm_Minimize(object sender, EventArgs e)
    {
        if(this.WindowState == FormWindowState.Minimized)
            Hide();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...