您的位置:首页 > 其它

关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息

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说明;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐