zoukankan      html  css  js  c++  java
  • 关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息

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

  • 相关阅读:
    Oracle 删除表中的一整列
    如何查看数据库中表的创建时间
    Oracle数据库的简单数据恢复
    分治和动态规划
    深入浅出 妙用Javascript中apply、call、bind
    CSS3 Background-size
    WampServer 2.5设置外网访问/局域网手机访问(403 Forbidden错误解决方法)
    js中apply方法的使用
    Leetcode No.1 Two Sum
    Python的sys.argv使用说明
  • 原文地址:https://www.cnblogs.com/furenjun/p/systemEvents.html
Copyright © 2011-2022 走看看