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

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

  1. 获取服务器主列表一直显示稍等,正在获取远程列表服务器信息

    正在获取远程列表服务器信息 内容精选 换一换 精简视图提供了云服务器资源概况和状态的可视化统计结果,帮助您直观的了解云服务器资源.在精简视图中,您可以快速获取弹性云服务器基本信息.登录信息.配置信息. ...

  2. 关闭C#主窗体弹出是否关闭对话框

    在开发系统时,常常有这样一个问题,就是当关闭主窗体,也即退出系统时,如果想提示是否关闭,以免误操作,可以在主窗体的Main_FormClosing事件中添加一个对话框,代码如下: private vo ...

  3. WinForm 之 程序启动不显示主窗体

    在 WinForm 程序启动时,不显示主窗体的实现方法主要有以下5种,第五种最简单,而且效果也不错,第四种方法也值得推荐. 实例代码如下: //隐藏窗体的方法1/5:不指定任何窗体为主窗体 //注意: ...

  4. 如何关闭父窗体?C#

    FormCollection fmCollection = System.Windows.Forms.Application.OpenForms; fmCollection[0].Close(); 可 ...

  5. 登录窗体与主窗体的关闭

    需求: 有一个登录窗体,有一个主窗体,登录窗体登录进去之后,就隐藏掉了. 主窗体右上角有个关闭按钮(窗体自带的),窗体上还有个<重新登录>按钮,  通过关闭右上角上的关闭按钮,关闭整个应用 ...

  6. winform的子窗体关闭刷新主窗体绑定数据以及刷新的总结

    1.其实实现主窗体的刷新无非就是比较简单的调用load事件重新加载数据绑定,但是这样的效果会带来,无状态刷新,页面无法保存上一次的页面状态,比如 刷新前 刷新后 ,如果点击刷新按钮执行的话,那么树形菜 ...

  7. 《转》在c/s中,登录成功后如何关闭登录窗体显示主窗体

    一.方法一 在主窗体FrmMain中申明 public static bool isRunMain = false; 把Program.cs文件改成: static class Program { / ...

  8. java swing 关闭_Java Swing 只关闭当前窗体的实现

    看到很多人都在询问怎么在java swing中只关闭当前的窗体,因此写下此文. 主界面主要是有两个jbutton,一个是通过按钮事件调起另一个jfame,另一个是关闭当前窗体. 1.关闭当前窗体不能使 ...

  9. C#关闭子窗口而不释放子窗口对象的问题解决

    在网上找来一些方式,感觉还都不错,下面给出方式: 在线扫描相机的调试过程中,需要开辟调试界面来进行位置的配置.调试结束后,一种常用的方式是将调试参数保存并在下次启动时加载.另一种简单方式是直接使用该参 ...

最新文章

  1. C++数组名做函数形参/指针
  2. VM与VPC共存(续)
  3. EasyExcel读写Excel的基本使用
  4. 指数分布的期望推导过程
  5. AJAX异步原理与实现
  6. ms project 入门_Microsoft Project 2010入门
  7. javafx中的tree_JavaFX中的塔防(3)
  8. javascript数组类型
  9. pip换源,解决pip下载超时,连接失败等问题
  10. python有趣的简单代码_简单代码一学就会,Python生成GIF动图
  11. linux内核兼容性,各种glibc和Linux内核版本的兼容性
  12. (二十六)java版spring cloud+spring boot 社交电子商务平台-Eureka介绍
  13. 获取文件夹以及子文件夹里面的所有文件
  14. 西门子1200PLC的OB块用法讲解
  15. python教程55--D-Tale使用介绍
  16. norms matlab
  17. 关于在vue中实现7天免登录
  18. Abbirb120型工业机器人_工控产品-ABB IRB120工业机器人-IRB120
  19. cie1931 python绘制_科学网—gnuplot与CIE1931 XYZ三刺激值曲线 - 范学良的博文
  20. 重置form表单中的input值

热门文章

  1. [数据结构] 希尔排序
  2. [笔记].在Quartus II下载时,找不到USB-Blaster的一个可能原因
  3. C++ 二进制转十进制
  4. Toon Boom Harmony 20v20.0中文版
  5. 算法习题---线性表之单链表逆序打印
  6. Django学习笔记(一):第一个django程序
  7. 03013_JDBC工具类
  8. (转)spring aop(下)
  9. VS之设置文件编码格式
  10. 《JAVA编程那点事儿》读书笔记(二)——类和对象