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

如何做到点击主窗体"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);
        }


补充说明:
   SystemEvents 类 (用于提供对系统事件通知的访问。)来获取用户注销或关闭系统信息;
   可查看MSDN说明;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值