关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息
如何做到点击主窗体"X"按钮,能隐藏窗体,而不退出主程序?让我们先来分析窗体所响应的几个事件的先后顺序:
一. 当前用户点击窗体"关闭",右上角上的"X"图标时的系统消息的响应顺序是:
1. 系统截获用户的点击消息,可通过重载 WndProc截获;
2. 触发窗体的 FormClosing 事件;
3. 关闭窗体,回收本窗体所占用的相应资源;
二. 当在程序中用 this.Close() 关闭窗体时,系统响应的顺序是:
1. 触发窗体的 FormClosing 事件;
2. 关闭窗体,回收本窗体所占用的相应资源;
三. 当用户关闭操作系统时,窗体响应的顺序是:
1. 触发窗体的 FormClosing 事件;
2. 触发窗体的 SystemEvents_SessionEnding 事件;
3. 关闭窗体,回收本窗体所占用的相应资源;
因此当我们希望在点击主窗体"X"图标时,不希望程序退出,而只是最小化并隐藏窗体,则最好是通过重载 WndProc,截获点击该按钮事件,实现窗体最小化,从而达到不退出主程序的目的.
而不是简单的在FormClosing 事件中加上 e.Cancel=true; 那样在关闭或注销系统时,就不能自动关闭该窗体(程序)了;
经过以上分析,我们只需在窗体中加上以下代码即可:
{
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 窗体中添加如下代码,以响应关机,注销或重启事件:
{
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);
}
补充说明:
SystemEvents 类 (用于提供对系统事件通知的访问。)来获取用户注销或关闭系统信息;
可查看MSDN说明;
关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息相关推荐
- 获取服务器主列表一直显示稍等,正在获取远程列表服务器信息
正在获取远程列表服务器信息 内容精选 换一换 精简视图提供了云服务器资源概况和状态的可视化统计结果,帮助您直观的了解云服务器资源.在精简视图中,您可以快速获取弹性云服务器基本信息.登录信息.配置信息. ...
- 关闭C#主窗体弹出是否关闭对话框
在开发系统时,常常有这样一个问题,就是当关闭主窗体,也即退出系统时,如果想提示是否关闭,以免误操作,可以在主窗体的Main_FormClosing事件中添加一个对话框,代码如下: private vo ...
- WinForm 之 程序启动不显示主窗体
在 WinForm 程序启动时,不显示主窗体的实现方法主要有以下5种,第五种最简单,而且效果也不错,第四种方法也值得推荐. 实例代码如下: //隐藏窗体的方法1/5:不指定任何窗体为主窗体 //注意: ...
- 如何关闭父窗体?C#
FormCollection fmCollection = System.Windows.Forms.Application.OpenForms; fmCollection[0].Close(); 可 ...
- 登录窗体与主窗体的关闭
需求: 有一个登录窗体,有一个主窗体,登录窗体登录进去之后,就隐藏掉了. 主窗体右上角有个关闭按钮(窗体自带的),窗体上还有个<重新登录>按钮, 通过关闭右上角上的关闭按钮,关闭整个应用 ...
- winform的子窗体关闭刷新主窗体绑定数据以及刷新的总结
1.其实实现主窗体的刷新无非就是比较简单的调用load事件重新加载数据绑定,但是这样的效果会带来,无状态刷新,页面无法保存上一次的页面状态,比如 刷新前 刷新后 ,如果点击刷新按钮执行的话,那么树形菜 ...
- 《转》在c/s中,登录成功后如何关闭登录窗体显示主窗体
一.方法一 在主窗体FrmMain中申明 public static bool isRunMain = false; 把Program.cs文件改成: static class Program { / ...
- java swing 关闭_Java Swing 只关闭当前窗体的实现
看到很多人都在询问怎么在java swing中只关闭当前的窗体,因此写下此文. 主界面主要是有两个jbutton,一个是通过按钮事件调起另一个jfame,另一个是关闭当前窗体. 1.关闭当前窗体不能使 ...
- C#关闭子窗口而不释放子窗口对象的问题解决
在网上找来一些方式,感觉还都不错,下面给出方式: 在线扫描相机的调试过程中,需要开辟调试界面来进行位置的配置.调试结束后,一种常用的方式是将调试参数保存并在下次启动时加载.另一种简单方式是直接使用该参 ...
最新文章
- C++数组名做函数形参/指针
- VM与VPC共存(续)
- EasyExcel读写Excel的基本使用
- 指数分布的期望推导过程
- AJAX异步原理与实现
- ms project 入门_Microsoft Project 2010入门
- javafx中的tree_JavaFX中的塔防(3)
- javascript数组类型
- pip换源,解决pip下载超时,连接失败等问题
- python有趣的简单代码_简单代码一学就会,Python生成GIF动图
- linux内核兼容性,各种glibc和Linux内核版本的兼容性
- (二十六)java版spring cloud+spring boot 社交电子商务平台-Eureka介绍
- 获取文件夹以及子文件夹里面的所有文件
- 西门子1200PLC的OB块用法讲解
- python教程55--D-Tale使用介绍
- norms matlab
- 关于在vue中实现7天免登录
- Abbirb120型工业机器人_工控产品-ABB IRB120工业机器人-IRB120
- cie1931 python绘制_科学网—gnuplot与CIE1931 XYZ三刺激值曲线 - 范学良的博文
- 重置form表单中的input值