最小化 C# WinForms 应用程序托盘的正确方法是什么?
题
将 WinForms 应用程序最小化到系统托盘的正确方法是什么?
笔记:最小化到 系统托盘;在任务栏右侧的时钟旁边。我不是在问最小化到任务栏,这就是当您点击窗口上的“减号”按钮时发生的情况。
我见过一些黑客解决方案,例如“最小化,设置 ShowInTaskbar = false,然后显示您的 NotifyIcon。”
类似的解决方案是很黑客的,因为该应用程序似乎不像其他应用程序那样最小化到托盘,代码必须检测何时设置 ShowInTaskbar = true 等问题。
执行此操作的正确方法是什么?
解决方案
实际上没有托管方法可以在本机 winform 中对托盘执行这种形式的动画,但是您可以 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 内容。
其他提示
this.WindowState = FormWindowState.Minimized
这是内置的方法,在我看来大多数时候都很好。唯一的情况是,如果你在启动时调用它,有时会有些奇怪,这就是为什么大多数人也会设置 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;
}
}
}
此代码经过测试并支持许多选项。
更新:看来我发帖太早了。我还使用了下面的 hack 作为我的工具。等待合适的解决方案............
您可以使用 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();
}
与上面类似...
我有一个调整大小事件处理程序,每当调整窗口大小(最大化、最小化等)时都会触发该事件处理程序...
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 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中