winForm窗体关闭按钮实现托盘后台运行(类似QQ托盘区运行)

今天遇到了一个需求,如果用户不小心点击了“关闭”按钮,但是他的本意不是想要真的关闭这个窗体。

 

对这个需求完全可以在单击“关闭”按钮的时候弹出一个对话框,来让用户确定是否真的要退出。这是一个很好的解决方法,并且实现也是很容易的。但是人家不想这样,想要拥有类似QQ在托盘区后台运行的那种效果,没办法,只能想办法来实现了。

 

其实,这个在网上也有很多的实现方法,但是我试了试有些直接复制过来并不能直接运行,或者能运行的吧又没有注释。今天在这里就给大家贴一下我的代码,也有不足之处,希望大家给出意见.


[csharp] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9.   
  10. using System.Windows;  
  11.   
  12.   
  13. namespace winform窗体托盘后台运行  
  14. {  
  15.     public partial class Form1 : Form   
  16.     {  
  17.         //这里在窗体上没有拖拽一个NotifyIcon控件,而是在这里定义了一个变量  
  18.         private NotifyIcon notifyIcon = null;  
  19.   
  20.         public Form1()  
  21.         {  
  22.             InitializeComponent();  
  23.             //调用初始化托盘显示函数  
  24.             InitialTray();  
  25.         }  
  26.   
  27.         private void Form1_Load(object sender, EventArgs e)  
  28.         {  
  29.             //这里写其他代码  
  30.         }  
  31.   
  32.         /// <summary>  
  33.         /// 窗体关闭的单击事件  
  34.         /// </summary>  
  35.         /// <param name="sender"></param>  
  36.         /// <param name="e"></param>  
  37.         private void Form1_FormClosing(object sender, FormClosingEventArgs e)  
  38.         {  
  39.             e.Cancel = true;  
  40.             //通过这里可以看出,这里的关闭其实不是真正意义上的“关闭”,而是将窗体隐藏,实现一个“伪关闭”  
  41.             this.Hide();  
  42.         }  
  43.   
  44.         private void InitialTray()  
  45.         {  
  46.             //隐藏主窗体  
  47.             this.Hide();  
  48.   
  49.             //实例化一个NotifyIcon对象  
  50.             notifyIcon = new NotifyIcon();  
  51.             //托盘图标气泡显示的内容  
  52.             notifyIcon.BalloonTipText = "正在后台运行";     
  53.             //托盘图标显示的内容  
  54.             notifyIcon.Text = "窗体托盘后台运行测试程序";  
  55.             //注意:下面的路径可以是绝对路径、相对路径。但是需要注意的是:文件必须是一个.ico格式  
  56.             notifyIcon.Icon = new System.Drawing.Icon("E:/ASP项目/images/3.5 inch Floppy.ico");  
  57.             //true表示在托盘区可见,false表示在托盘区不可见  
  58.             notifyIcon.Visible = true;  
  59.             //气泡显示的时间(单位是毫秒)  
  60.             notifyIcon.ShowBalloonTip(2000);              
  61.             notifyIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(notifyIcon_MouseClick);  
  62.               
  63.             ////设置二级菜单  
  64.             //MenuItem setting1 = new MenuItem("二级菜单1");  
  65.             //MenuItem setting2 = new MenuItem("二级菜单2");  
  66.             //MenuItem setting = new MenuItem("一级菜单", new MenuItem[]{setting1,setting2});  
  67.   
  68.             //帮助选项,这里只是“有名无实”在菜单上只是显示,单击没有效果,可以参照下面的“退出菜单”实现单击事件  
  69.             MenuItem help = new MenuItem("帮助");  
  70.   
  71.             //关于选项  
  72.             MenuItem about = new MenuItem("关于");  
  73.   
  74.             //退出菜单项  
  75.             MenuItem exit = new MenuItem("退出");  
  76.             exit.Click += new EventHandler(exit_Click);  
  77.   
  78.             ////关联托盘控件  
  79.             //注释的这一行与下一行的区别就是参数不同,setting这个参数是为了实现二级菜单  
  80.             //MenuItem[] childen = new MenuItem[] { setting, help, about, exit };  
  81.             MenuItem[] childen = new MenuItem[] {help,about,exit};  
  82.             notifyIcon.ContextMenu = new ContextMenu(childen);  
  83.   
  84.             //窗体关闭时触发  
  85.             this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);  
  86.         }  
  87.         
  88.         /// <summary>  
  89.         /// 鼠标单击  
  90.         /// </summary>  
  91.         /// <param name="sender"></param>  
  92.         /// <param name="e"></param>  
  93.         private void notifyIcon_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)  
  94.         {  
  95.             //鼠标左键单击  
  96.             if (e.Button == MouseButtons.Left)  
  97.             {  
  98.                 //如果窗体是可见的,那么鼠标左击托盘区图标后,窗体为不可见  
  99.                 if (this.Visible == true )  
  100.                 {  
  101.                     this.Visible = false;  
  102.                 }  
  103.                 else  
  104.                 {  
  105.                     this.Visible = true;  
  106.                     this.Activate();  
  107.                 }  
  108.             }  
  109.         }  
  110.   
  111.         /// <summary>  
  112.         /// 退出选项  
  113.         /// </summary>  
  114.         /// <param name="sender"></param>  
  115.         /// <param name="e"></param>  
  116.         private void exit_Click(object sender, EventArgs e)  
  117.         {  
  118.             //退出程序  
  119.            System.Environment.Exit(0);    
  120.         }  
  121.     }  
  122. }  
展开阅读全文

没有更多推荐了,返回首页