1.在主窗体中添加一个 NotifyIcon 控件-notifyIcon1
2.在主窗体中添加一个 ContextMenu 控件-contextMenu1,并添加菜单项
3.设置 notifyIcon1 的属性:
将notifyIcon1.ContextMenu 设置为 contextMenu1
notifyIcon1.Visible = true
notifyIcon1.Icon 设置到一个图标文件
3.处理主窗体的closing事件,即关闭主窗体时就最小化到系统托盘
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel = true; //取消窗体关闭事件
this.Visible = false; //隐藏主窗体
}
4.在系统托盘中主窗体的图标上单击右键,出现上下文菜单(contextMenu1)
在某个菜单项的方法中,确保可以恢复主窗体
private void menuItem1_Click(object sender, System.EventArgs e)
{
this.Visible = true; //恢复主窗体
}
在某个菜单项的方法中,确保可以退出程序
private void menuItem2_Click(object sender, System.EventArgs e)
{
Application.Exit();
}
5.也可以不使用上下文菜单来恢复窗体,直接处理notifyIcon1的DoubleClik事件(双击恢复主窗体)
private void notifyIcon1_DoubleClick(object sender, System.EventArgs e)
{
if (this.Visible == false)
{
this.Visible = true;
}
}
其中退出程序的那部分代码是有问题的
Application.Exit();还是不能退出应用程序
有人说原因在于Application.Exit还是会去调用closing 结果是被阻止关闭了,就有人用了dispose 确实能退出。
经过跟踪确实是的。
但还是有好多疑问
MSDN上对Application.Exit的解释是这样的:
Exit 方法停止在所有线程上运行的所有消息循环,并关闭应用程序的所有窗口。该方法并不强制退出该应用程序。Exit 方法通常从一个消息循环内调用,该方法强制 Run 返回。若要只退出当前线程的某个消息循环,请调用 ExitThread。
Exit 引发下列事件并执行关联的条件操作:
- 为 OpenForms 属性表示的各个窗体引发 FormClosing 事件。可以通过将这些窗体的 FormClosingEventArgs 参数的 Cancel 属性设置为 true,取消此事件。
- 如果多个处理程序的其中之一取消该事件,则 Exit 将返回而无进一步操作。否则,将为每个打开的窗体引发 FormClosed 事件,然后关闭所有正在运行的消息循环和窗体。
注意: |
---|
Exit 方法不会引发 Closed 和 Closing 事件,这两个事件自 .NET Framework 2.0 起已过时。 这样的解释说明让我看的云里雾里的,有点懵了。还请牛人指教。 |