关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息
2008-05-17 13:01
281 查看
如何做到点击主窗体"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)
Form1 frmMain = new Form1();
SystemEvents.SessionEnding += new SessionEndingEventHandler(frmMain.SystemEvents_SessionEnding);
在Form1 窗体中添加如下代码,以响应关机,注销或重启事件:
internal void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{
{
{
msgTitle = "注销";
msgQuestion = "真的要注销吗?";
}
DialogResult result = MessageBox.Show(msgQuestion , msgTitle , MessageBoxButtons.YesNo);
e.Cancel = (result == DialogResult.No);
}
补充说明:
SystemEvents 类 (用于提供对系统事件通知的访问。)来获取用户注销或关闭系统信息;
可查看MSDN说明;
一. 当前用户点击窗体"关闭",右上角上的"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)
Form1 frmMain = new Form1();
SystemEvents.SessionEnding += new SessionEndingEventHandler(frmMain.SystemEvents_SessionEnding);
在Form1 窗体中添加如下代码,以响应关机,注销或重启事件:
internal void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{
{
{
msgTitle = "注销";
msgQuestion = "真的要注销吗?";
}
DialogResult result = MessageBox.Show(msgQuestion , msgTitle , MessageBoxButtons.YesNo);
e.Cancel = (result == DialogResult.No);
}
补充说明:
SystemEvents 类 (用于提供对系统事件通知的访问。)来获取用户注销或关闭系统信息;
可查看MSDN说明;
相关文章推荐
- 关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息
- 关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息
- [Mac OS X Cocoa编程]如何获取其他应用程序的窗体标题以及相关信息?
- SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息
- SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息
- Android获取系统的硬件信息、系统版本以及如何检测ROM类型
- 如何关闭Windows程序异常退出时的提示信息对话框
- Android获取系统的硬件信息、系统版本以及如何检测ROM类型
- 切换导航标签实现当前标签颜色改变以及利用js如何准确获取当前页面url网址信息
- Java如何获取系统信息(包括操作系统、jvm、cpu、内存、硬盘、网络、io等)
- 注册irc用户名以及申请irc频道 管理员退出后再登录如何获取管理员权限
- Java中如何获取当前操作系统的相关信息
- 一起学android之如何获取手机程序列表以及程序相关信息并启动指定程序 (26)
- jsp中如何获取客户端的浏览器和操作系统信息
- jsp中如何获取客户端的浏览器和操作系统信息
- 如何获取iphone的硬件版本以及系统信息
- C#.NET常见问题(FAQ)-如何捕捉窗体关闭的事件,弹窗确认是否退出
- 如何获取iphone的硬件版本以及系统信息
- js内如何导入jason文件及从做好的文件内获取输入框信息,以及离子特效文件
- ASP.NET(C#)中如何获取IP,名称,操作系统,浏览器等信息