winForm窗体关闭按钮实现托盘后台运行(类似QQ托盘区运行)
2016-09-01 11:14
465 查看
今天遇到了一个需求,如果用户不小心点击了“关闭”按钮,但是他的本意不是想要真的关闭这个窗体。
对这个需求完全可以在单击“关闭”按钮的时候弹出一个对话框,来让用户确定是否真的要退出。这是一个很好的解决方法,并且实现也是很容易的。但是人家不想这样,想要拥有类似QQ在托盘区后台运行的那种效果,没办法,只能想办法来实现了。
其实,这个在网上也有很多的实现方法,但是我试了试有些直接复制过来并不能直接运行,或者能运行的吧又没有注释。今天在这里就给大家贴一下我的代码,也有不足之处,希望大家给出意见.
[csharp] view
plain copy
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows;
namespace winform窗体托盘后台运行
{
public partial class Form1 : Form
{
//这里在窗体上没有拖拽一个NotifyIcon控件,而是在这里定义了一个变量
private NotifyIcon notifyIcon = null;
public Form1()
{
InitializeComponent();
//调用初始化托盘显示函数
InitialTray();
}
private void Form1_Load(object sender, EventArgs e)
{
//这里写其他代码
}
/// <summary>
/// 窗体关闭的单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
//通过这里可以看出,这里的关闭其实不是真正意义上的“关闭”,而是将窗体隐藏,实现一个“伪关闭”
this.Hide();
}
private void InitialTray()
{
//隐藏主窗体
this.Hide();
//实例化一个NotifyIcon对象
notifyIcon = new NotifyIcon();
//托盘图标气泡显示的内容
notifyIcon.BalloonTipText = "正在后台运行";
//托盘图标显示的内容
notifyIcon.Text = "窗体托盘后台运行测试程序";
//注意:下面的路径可以是绝对路径、相对路径。但是需要注意的是:文件必须是一个.ico格式
notifyIcon.Icon = new System.Drawing.Icon("E:/ASP项目/images/3.5 inch Floppy.ico");
//true表示在托盘区可见,false表示在托盘区不可见
notifyIcon.Visible = true;
//气泡显示的时间(单位是毫秒)
notifyIcon.ShowBalloonTip(2000);
notifyIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(notifyIcon_MouseClick);
////设置二级菜单
//MenuItem setting1 = new MenuItem("二级菜单1");
//MenuItem setting2 = new MenuItem("二级菜单2");
//MenuItem setting = new MenuItem("一级菜单", new MenuItem[]{setting1,setting2});
//帮助选项,这里只是“有名无实”在菜单上只是显示,单击没有效果,可以参照下面的“退出菜单”实现单击事件
MenuItem help = new MenuItem("帮助");
//关于选项
MenuItem about = new MenuItem("关于");
//退出菜单项
MenuItem exit = new MenuItem("退出");
exit.Click += new EventHandler(exit_Click);
////关联托盘控件
//注释的这一行与下一行的区别就是参数不同,setting这个参数是为了实现二级菜单
//MenuItem[] childen = new MenuItem[] { setting, help, about, exit };
MenuItem[] childen = new MenuItem[] {help,about,exit};
notifyIcon.ContextMenu = new ContextMenu(childen);
//窗体关闭时触发
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
}
/// <summary>
/// 鼠标单击
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void notifyIcon_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
//鼠标左键单击
if (e.Button == MouseButtons.Left)
{
//如果窗体是可见的,那么鼠标左击托盘区图标后,窗体为不可见
if (this.Visible == true )
{
this.Visible = false;
}
else
{
this.Visible = true;
this.Activate();
}
}
}
/// <summary>
/// 退出选项
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void exit_Click(object sender, EventArgs e)
{
//退出程序
System.Environment.Exit(0);
}
}
}
对这个需求完全可以在单击“关闭”按钮的时候弹出一个对话框,来让用户确定是否真的要退出。这是一个很好的解决方法,并且实现也是很容易的。但是人家不想这样,想要拥有类似QQ在托盘区后台运行的那种效果,没办法,只能想办法来实现了。
其实,这个在网上也有很多的实现方法,但是我试了试有些直接复制过来并不能直接运行,或者能运行的吧又没有注释。今天在这里就给大家贴一下我的代码,也有不足之处,希望大家给出意见.
[csharp] view
plain copy
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows;
namespace winform窗体托盘后台运行
{
public partial class Form1 : Form
{
//这里在窗体上没有拖拽一个NotifyIcon控件,而是在这里定义了一个变量
private NotifyIcon notifyIcon = null;
public Form1()
{
InitializeComponent();
//调用初始化托盘显示函数
InitialTray();
}
private void Form1_Load(object sender, EventArgs e)
{
//这里写其他代码
}
/// <summary>
/// 窗体关闭的单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
//通过这里可以看出,这里的关闭其实不是真正意义上的“关闭”,而是将窗体隐藏,实现一个“伪关闭”
this.Hide();
}
private void InitialTray()
{
//隐藏主窗体
this.Hide();
//实例化一个NotifyIcon对象
notifyIcon = new NotifyIcon();
//托盘图标气泡显示的内容
notifyIcon.BalloonTipText = "正在后台运行";
//托盘图标显示的内容
notifyIcon.Text = "窗体托盘后台运行测试程序";
//注意:下面的路径可以是绝对路径、相对路径。但是需要注意的是:文件必须是一个.ico格式
notifyIcon.Icon = new System.Drawing.Icon("E:/ASP项目/images/3.5 inch Floppy.ico");
//true表示在托盘区可见,false表示在托盘区不可见
notifyIcon.Visible = true;
//气泡显示的时间(单位是毫秒)
notifyIcon.ShowBalloonTip(2000);
notifyIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(notifyIcon_MouseClick);
////设置二级菜单
//MenuItem setting1 = new MenuItem("二级菜单1");
//MenuItem setting2 = new MenuItem("二级菜单2");
//MenuItem setting = new MenuItem("一级菜单", new MenuItem[]{setting1,setting2});
//帮助选项,这里只是“有名无实”在菜单上只是显示,单击没有效果,可以参照下面的“退出菜单”实现单击事件
MenuItem help = new MenuItem("帮助");
//关于选项
MenuItem about = new MenuItem("关于");
//退出菜单项
MenuItem exit = new MenuItem("退出");
exit.Click += new EventHandler(exit_Click);
////关联托盘控件
//注释的这一行与下一行的区别就是参数不同,setting这个参数是为了实现二级菜单
//MenuItem[] childen = new MenuItem[] { setting, help, about, exit };
MenuItem[] childen = new MenuItem[] {help,about,exit};
notifyIcon.ContextMenu = new ContextMenu(childen);
//窗体关闭时触发
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
}
/// <summary>
/// 鼠标单击
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void notifyIcon_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
//鼠标左键单击
if (e.Button == MouseButtons.Left)
{
//如果窗体是可见的,那么鼠标左击托盘区图标后,窗体为不可见
if (this.Visible == true )
{
this.Visible = false;
}
else
{
this.Visible = true;
this.Activate();
}
}
}
/// <summary>
/// 退出选项
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void exit_Click(object sender, EventArgs e)
{
//退出程序
System.Environment.Exit(0);
}
}
}
相关文章推荐
- winForm窗体关闭按钮实现托盘后台运行(类似QQ托盘区运行)
- winForm窗体关闭按钮实现托盘后台运行(类似QQ托盘区运行)
- 【转载】winForm窗体关闭按钮 实现提示选择,托盘后台运行或退出(类似QQ托盘区运行)
- Android按返回键程序仍在后台运行,并未完全退出和销毁,类似微信QQ等退出方式的实现-- moveTaskToBack
- C#之WinForm基础 运行多个窗体时,点击按钮,一次关闭所有窗体
- C#实现WinForm程序的动态系统托图标 关闭主窗体时最小化到系统托盘
- Android实现程序前后台切换效果(类似QQ后台运行)
- 如何实现“WinForm窗体禁用关闭按钮”方法功能及源代码
- C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法,可通过重写WndProc来实现
- Android实现程序前后台切换效果(类似QQ后台运行)
- winform实现任务栏隐藏、通知栏图标及右键、类似QQ隐藏窗体等功能
- c# winform 让Form窗体上系统自带的红色关闭按钮失效,点击关闭变为最小化
- .net网站与Winform窗体的数据交互(JS调用Winform后台方法实现)
- 类似QQ的抖动窗体的实现
- C# Winform 捕获窗体的最小化和最大化事件、关闭按钮事件【整理】
- Winform窗体实现类似停靠在屏幕边缘时自动隐藏的功能
- 禁用winform窗体上的关闭按钮
- C#类似QQ窗体抖动功能的实现
- 蛋疼的让C#控制台程序(Console)像窗体(Winform)一样(关闭,托盘图标,事件响应,手动退出等)
- Winform托盘NotifyIcon使用(类似QQ消息提示)