winform拦截关闭按钮触发的事件示例

 更新时间:2014年01月21日 11:21:37   作者:  
这篇文章主要介绍了c# winform拦截关闭按钮触发的事件示例,大家参考使用吧

用户关闭软件时,软件一般会给“是否确认关闭”的提示。通常,我们把它写在FormClosing 事件中,如果确定关闭,就关闭;否则把FormClosingEventArgs 的 Cancel 属性设置为 true,就取消了该窗体的关闭。

如果该窗体是主窗体,我们想在该窗体关闭时关闭整个应用程序,会遇到至少两种情况:

(1)该窗体同时是启动窗体,即它是应用程序中所有窗体的父类,则整个应用程序会被关闭。

(2)如果该窗体不是启动窗体,比如我们做了一个欢迎窗体,则应用程序中所有窗体的父类就是这个欢迎窗体了。这时该窗体的关闭并不会关闭整个应用程序。我们需要再加入“Application.Exit()”这行代码来退出应用程序。但同时又有问题了,父窗体的关闭又会给该窗体发送关闭事件,于是该事件又被调用一次,确认对话框又会弹出第二次。解决方法是用下面的代码:

注:做欢迎体界面可以在主窗体中,ShowDialog方法打开欢迎界面,而不是把欢迎界面作为启动窗体。下面的方法仅有理论意义。

复制代码 代码如下:

 protected override void WndProc(ref Message m)
{
    //Console.WriteLine(m.Msg);
    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();
        return;
    }
    base.WndProc(ref m);
}

C# 窗体关闭时可以触发的事件

FormClosing :在窗体关闭时,FormClosing 事件发生。窗体关闭时,此事件会得到处理,从而释放与此窗体关联的所有资源。如果取消此事件,则该窗体保持打开状态。若要取消窗体的关闭操作,请将传递给事件处理程序的 FormClosingEventArgs 的 Cancel 属性设置为 true。

FormClosed:在用户或 Application 类的 Close 方法或 Exit 方法关闭窗体后,会发生 FormClosed 事件。若要防止窗体关闭,请处理 FormClosing 事件,并将传递给事件处理程序的 CancelEventArgs 的 Cancel 属性设置为 true。可以使用此事件执行一些任务,如释放窗体使用的资源,还可使用此事件保存输入窗体中的信息或更新其父窗体。

当窗体显示为模式对话框时,单击“关闭”按钮(窗体右上角带 X 的按钮)会隐藏窗体并将 DialogResult 属性设置为 DialogResult.Cancel。通过在窗体的 FormClosing 事件的事件处理程序中设置 DialogResult 属性,可以在用户单击“关闭”按钮时重写分配给 DialogResult 属性的值。

注意

在显示为无模式窗口的 Form 上调用 Close 方法时,不能调用 Show 方法使窗体可见,因为窗体的资源已被释放。若要隐藏窗体然后又使其可见,请使用 Hide 方法。

如果窗体是多文档界面 (MDI) 父窗体,则在引发 MDI 父窗体的 FormClosing 事件之前将引发所有 MDI 子窗体的 FormClosing 事件。同样,在引发 MDI 父窗体的 FormClosed 事件之前,将引发所有 MDI 子窗体的 FormClosed 事件。取消 MDI 子窗体的 FormClosing 事件不能防止引发 MDI 父窗体的 FormClosing 事件。但是,取消该事件会将作为参数传递给父窗体的 FormClosingEventArgs 类的 Cancel 属性设置成 false。要强制关闭所有 MDI 父窗体和子窗体,请将 MDI 父窗体中的 Cancel 属性设置成 false。

下面一个简单例子:

复制代码 代码如下:

 private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
 { 
     DialogResult result = MessageBox.Show("你确定要关闭吗!", "提示信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); 
     if (result == DialogResult.OK) 
     { 
e.Cancel = false;  //点击OK
     } 
     else
     { 
e.Cancel = true; 
     } 
 }

相关文章

  • C#实现自定义FTP操作封装类实例

    C#实现自定义FTP操作封装类实例

    这篇文章主要介绍了C#实现自定义FTP操作封装类,涉及C#操作FTP的连接、传输、下载等操作的实现技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • C#编译器对局部变量的优化指南

    C#编译器对局部变量的优化指南

    这篇文章主要给大家介绍了关于C#编译器对局部变量的优化指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C#使用GDI+创建缩略图实例

    C#使用GDI+创建缩略图实例

    这篇文章主要介绍了C#使用GDI+创建缩略图实例,是C#程序设计中非常实用的技巧,需要的朋友可以参考下
    2014-10-10
  • c#得到本月有几周和这几周的起止时间示例代码

    c#得到本月有几周和这几周的起止时间示例代码

    本篇文章主要是对c#得到本月有几周和这几周的起止时间的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • 深入理解C#中的Delegate

    深入理解C#中的Delegate

    委托是一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似。与 C 中的函数指针不同,委托是面向对象的、类型安全的和保险的。委托的类型由委托的名称定义
    2016-07-07
  • C#4.0新特性之协变与逆变实例分析

    C#4.0新特性之协变与逆变实例分析

    这篇文章主要介绍了C#4.0新特性的协变与逆变,是比较实用的一个新功能,需要的朋友可以参考下
    2014-09-09
  • C#管道式编程的介绍与实现

    C#管道式编程的介绍与实现

    这篇文章主要给大家介绍了关于C#管道式编程的介绍与实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • 如何实现定时推送的具体方案

    如何实现定时推送的具体方案

    在工作当中遇到了一个需要定时向客户端推送新闻、文章等内容。小项目又用不了大框架,这个时候在网上搜了很久没有找到合适的解决方案,直到看到了一位大佬写的文章提供了一个非常不错的思路本篇文章也是受到他的启发实现了之后这里分享给大家
    2021-04-04
  • Js中的substring,substr与C#中的Substring比较

    Js中的substring,substr与C#中的Substring比较

    本篇文章主要是对Js中的substring,substr与C#中的Substring进行了比较。需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • C#中动态显示当前系统时间的实例方法

    C#中动态显示当前系统时间的实例方法

    想在网页中动态地显示当前系统的时间,找了好多,不过都是一些停在那里不动的。。。不过皇天不负有心人,终于让我找到了
    2013-05-05

最新评论