最小化托盘C#WinForms应用程序的正确方法是什么?

最小化托盘C#WinForms应用程序的正确方法是什么?

What's the proper way to minimize to tray a C# WinForms app?

将WinForms应用最小化到系统托盘的正确方法是什么?

注意:最小化到系统托盘; 在时钟右侧的任务栏上。 我并不是问最小化任务栏,这是当您单击窗口上的"减号"按钮时发生的情况。

我见过一些骇人听闻的解决方案,例如"最小化,将ShowInTaskbar = false设置,然后显示您的NotifyIcon。"

像这样的解决方案很棘手,因为该应用程序似乎没有像其他应用程序那样最小化,因此代码必须检测何时将ShowInTaskbar = true设置为其他问题。

正确的方法是什么?


实际上,没有任何托管方法可以在本机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

您可以使用它来找出针对C#版本需要Pinvoke的东西。


1
this.WindowState = FormWindowState.Minimized

这是一种内置的方法,在大多数情况下对我来说还不错。唯一的时间是有些怪异,如果您在启动时调用它有时会有些怪异,这就是为什么大多数人还会设置ShowInTaskbar = false并隐藏表单的原因。

http://msdn.microsoft.com/zh-CN/library/system.windows.forms.form.windowstate.aspx


这将有助于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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.Forms.NotifyIcon。 http://msdn.microsoft.com/zh-CN/library/system.windows.forms.notifyicon.aspx

将NotifyIcon添加到表单,设置一些属性,您就完成了。

1
2
3
4
5
6
7
8
9
        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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    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->,然后单击"最小化到纸盘"。如果选中,
然后将窗口的大小调整为"最小化",然后它将最小化到托盘。完美地为我工作。


如果您在执行此操作时遇到问题,请检查是否已

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

在fom1.designer.cs中


在窗体的构造函数中:

1
this.Resize += new EventHandler(MainForm_Minimize);

然后使用此事件处理程序方法:

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


推荐阅读