最小化托盘C#WinForms应用程序的正确方法是什么?
将WinForms应用最小化到系统托盘的正确方法是什么?
注意:最小化到系统托盘;在任务栏右侧按时钟排列。我并不是在问最小化任务栏,这是当我们单击窗口上的"减号"按钮时发生的事情。
我见过一些棘手的解决方案,例如"最小化,将ShowInTaskbar = false设置,然后显示NotifyIcon"。
像这样的解决方案是骇人听闻的,因为该应用程序似乎没有像其他应用程序那样最小化,因此代码必须检测何时将ShowInTaskbar = true设置为其他问题。
这样做的正确方法是什么?
解决方案
回答
this.WindowState = FormWindowState.Minimized
这是一种内置的方式,大多数时候对我来说看起来不错。唯一的时间是有些奇怪,如果我们在启动时调用它有时会有些奇怪,这就是为什么大多数人也会设置ShowInTaskbar = false并隐藏表单的原因。
http://msdn.microsoft.com/zh-CN/library/system.windows.forms.form.windowstate.aspx
回答
更新:看起来我发布得太早了。
我还使用下面的技巧作为我的工具。等待正确的解决方案……....
我们可以为此使用Windows.Forms.NotifyIcon。 http://msdn.microsoft.com/zh-CN/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(); }
回答
实际上,没有任何托管方法可以在本机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
我们可以使用它来为Cversion找出哪些内容需要Pinvoke。
回答
此代码已经过测试,并支持许多选项。
此处更多信息:http://code.msdn.microsoft.com/TheNotifyIconExample
回答
在窗体的构造函数中:
this.Resize += new EventHandler(MainForm_Minimize);
然后使用此事件处理程序方法:
private void MainForm_Minimize(object sender, EventArgs e) { if(this.WindowState == FormWindowState.Minimized) 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 System.EventHandler(this.Form1_Resize);
在fom1.designer.cs中
回答
这会有所帮助,
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; } } }