将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();
} |