C#实现WinForm程序的动态系统托盘图标

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 起已过时。

 

这样的解释说明让我看的云里雾里的,有点懵了。还请牛人指教。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值