关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息
来源:互联网 发布:手机淘宝优惠卷怎么用 编辑:程序博客网 时间:2024/06/11 20:45
如何做到点击主窗体"X"按钮,能隐藏窗体,而不退出主程序?让我们先来分析窗体所响应的几个事件的先后顺序:
一. 当前用户点击窗体"关闭",右上角上的"X"图标时的系统消息的响应顺序是:
1. 系统截获用户的点击消息,可通过重载 WndProc截获;
2. 触发窗体的 FormClosing 事件;
3. 关闭窗体,回收本窗体所占用的相应资源;
二. 当在程序中用 this.Close() 关闭窗体时,系统响应的顺序是:
1. 触发窗体的 FormClosing 事件;
2. 关闭窗体,回收本窗体所占用的相应资源;
三. 当用户关闭操作系统时,窗体响应的顺序是:
1. 触发窗体的 FormClosing 事件;
2. 触发窗体的 SystemEvents_SessionEnding 事件;
3. 关闭窗体,回收本窗体所占用的相应资源;
因此当我们希望在点击主窗体"X"图标时,不希望程序退出,而只是最小化并隐藏窗体,则最好是通过重载 WndProc,截获点击该按钮事件,实现窗体最小化,从而达到不退出主程序的目的.
而不是简单的在FormClosing 事件中加上 e.Cancel=true; 那样在关闭或注销系统时,就不能自动关闭该窗体(程序)了;
经过以上分析,我们只需在窗体中加上以下代码即可:
protected override void WndProc(ref Message m)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_CLOSE = 0xF060;
if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
{
this.WindowState = FormWindowState.Minimized;
this.Hide();
MessageBox.Show("click close button");
return;
}
base.WndProc(ref m);
}
四. 截获系统的关闭,注销信息
只需在程序Main()函数中为主窗体添加SystemEvents_SessionEnding事件;
Form1 frmMain = new Form1();
SystemEvents.SessionEnding += new SessionEndingEventHandler(frmMain.SystemEvents_SessionEnding);
在Form1 窗体中添加如下代码,以响应关机,注销或重启事件:
internal void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{
string exitType = e.Reason.ToString().Trim().ToUpper();
MessageBox.Show(exitType);
string msgTitle = "";
string msgQuestion = "";
if (exitType.Contains("SHUTDOWN"))
{
msgTitle = "关机";
msgQuestion = "真的要关机吗?";
}
else if (exitType.Contains("LOGOFF"))
{
msgTitle = "注销";
msgQuestion = "真的要注销吗?";
}
DialogResult result = MessageBox.Show(msgQuestion , msgTitle , MessageBoxButtons.YesNo);
e.Cancel = (result == DialogResult.No);
}
- 关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息
- 关闭当前窗体而不退出应用程序
- 关闭除主程序以外的所有窗体
- 窗体关闭按钮事件,确认退出,取消不退出
- 关闭主程序时如何关闭子线程
- C#退出非主窗体时关闭程序的方法
- java中主窗体关闭子窗体不关闭的解决办法
- 在SDI框架下实现关闭文档而不退出程序的功能
- Qt中点击关闭任务栏而不退出程序的实现方法
- C# 使用Thread多线程,窗体关闭后进程不退出的解决方案
- java子窗体关闭时防止主窗体退出
- Winform 实现进入主程序窗体后关闭登录窗体
- WPF ,如何退出窗体而不触发closing事件
- C#.NET常见问题(FAQ)-如何捕捉窗体关闭的事件,弹窗确认是否退出
- 在不小心关闭浏览器后,如何还能访问关闭浏览器前的session信息
- C# 如何窗体去掉上面的最大化,最小化合关闭以及实现无边框窗体拖动
- C#之窗体的关闭和程序的退出...
- 多线程关闭窗体时所有线程都退出的方法
- list map set总结
- 引用与指针的联系
- 得用户者得天下
- .NET CSDN问题及解决方案汇总
- 收集的maven 仓库地址(maven repository)
- 关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息
- struts:循环list的所用方法2
- 多条件查询
- 数据绑定之DataFormatString
- struts:循环list的所用方法3
- ASCII码表(二进制 十进制 十六进制)
- 层1
- struts:循环list的所用方法4
- C++函数的重载与覆盖