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

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

注意:尽量减less到系统托盘 ; 在时钟右侧的任务栏。 我不问任何问题最小化任务栏,当你点击窗口上的“减号”button时会发生什么情况。

我已经看到了像“最小化,设置ShowInTaskbar = false,然后显示您的NotifyIcon”的黑客解决scheme。

像这样的解决scheme是hackish,因为该应用程序似乎不像其他应用程序的托盘最小化,代码必须检测何时设置ShowInTaskbar = true等问题。

什么是正确的方法来做到这一点?

实际上没有pipe理的方式来做本地winforms托盘的animationforms,但是你可以P / Invoke shell32.dll来做到这一点:

这里有一些很好的信息(在评论中不是post):

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

这里是在C ++中:

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

你可以使用它来弄清楚为你的C#版本拼凑什么东西。

this.WindowState = FormWindowState.Minimized 

这是build立在这样做的方式,大多数时候我看起来很好。 唯一的一点是,如果你在启动时调用它,有时候会有些怪异,这就是为什么大多数人也会设置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; } } } 

此代码已经过testing并支持许多选项。

更多这里: http : //code.msdn.microsoft.com/TheNotifyIconExample

更新:看起来我过早发布。 我也在使用下面的hack作为我的工具。 等待这个正确的解决scheme……….

你可以使用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(); } 

与上面类似…

我有一个resize事件处理程序,每当窗口被resize(最大化,最小化等)触发…

  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; } } 

这允许用户通过菜单栏select他们是否想要最小化到托盘。 他们可以去Windows – >然后点击Minimize to Tray。 如果选中此项,并且窗口正在调整到最小化,那么它将最小化到托盘。 为我工作完美无瑕。

在窗体的构造函数中:

 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.designer.cs中