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)
{
//捕捉关闭窗体消息 http://www.cnblogs.com/sosoft/
//用户点击关闭窗体控制按钮 注释为最小化窗体
//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#操作SQL Server数据库的实例:http://hovertree.com/h/bjaf/scjyuanma.htm
C# Winform 拦截关闭按钮触发的事件的更多相关文章
- [转] C# Winform 拦截关闭按钮触发的事件
原文 C# Winform 拦截关闭按钮触发的事件 用户关闭软件时,软件一般会给“是否确认关闭”的提示. 通常,我们把它写在FormClosing 事件中,如果确定关闭,就关闭:否则把FormClos ...
- c#winform关闭窗口时触发的事件
用户关闭软件时,软件一般会给“是否确认关闭”的提示. 通常,我们把它写在FormClosing 事件中,如果确定关闭,就关闭:否则把FormClosingEventArgs 的 Cancel 属性设置 ...
- Winform 点击TreeView控件节点的CheckBox不触发NodeMouseClick事件的做法
private void Tv_areainfo_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if (!e.Node. ...
- winform Combox绑定数据时不触发SelectIndexChanged事件
做了一个仓库选择的联动,选了仓库选其下的货区,选了货区选其下的货架分区.每个combox初始化.绑定数据是都会触发SelectIndexChanged事件,相当头疼. 后来无意中在网上看到了一种方法— ...
- C#中如何截取Windows消息来触发自定义事件
原文 C#中如何截取Windows消息来触发自定义事件 在c#windows开发中,我们常常会遇到拦截windows消息,来触发某个特定任务的问题. 由于目前使用c#的开发人员非常多,而且大多数c#程 ...
- WinForm中如何判断关闭事件来源于用户点击右上角的“关闭”按钮
在C#的WinForm程序中,有的时候需要判定关闭请求从哪里发出来的.比如是用户点击了右上角的“关闭”按钮,还是调用了WinForm.Close()方法.最典型的是要知道点击右上角的“关闭”按钮发出的 ...
- vb.net WPF webbrowser window.close 关闭后不触发 WindowClosing 事件 WNDPROC解决方式
vb.net WPF webbrowser window.close 关闭后不触发 WindowClosing 事件 WNDPROC解决方式 #Region "WPF 当浏览器窗体关闭 ...
- app内嵌vue h5,安卓和ios拦截H5点击事件
安卓和ios拦截h5点击事件,这个函数事件必须是暴漏在window下的 安卓和ios拦截普通h5函数: <div onclick = "show(),window.android.sh ...
- GridView点击行触发SelectedIndexChanged事件
1.在<% @Page ...... %>指令中添加 EnableEventValidation="false" 2.在RowDataBound事件中添加 protec ...
随机推荐
- ABP理论学习之授权(Authorization)
返回总目录 本篇目录 介绍 定义权限 检查权限 使用AbpAuthorize特性 使用IPermissionChecker Razor视图 客户端(Javascript) 权限管理者 介绍 几乎所有的 ...
- 使用VS2013分析DMP文件
当一个发布的.NET应用程序出现app crash,无法通过日志分析异常原因时,就需要通过分析DMP文件了,传统方式是通过WinDbg来分析DMP文件,但是WinDbg用起来不是很方便,其实VS就是一 ...
- 【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构
一.业务发展驱动数据发展 随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长.特别是在用户访问高峰期间,并发访问量突然增大,数据库的负载压力也会增大,如果架构方案 ...
- 【javascript 技巧】谈谈setTimeout的作用域以及this的指向问题
setTimeout的用法详见:http://www.w3school.com.cn/htmldom/met_win_settimeout.asp 是的,setTimeout的常见用法是让某个方法延迟 ...
- ASP.NET MVC 5 -从控制器访问数据模型
在本节中,您将创建一个新的MoviesController类,并在这个Controller类里编写代码来取得电影数据,并使用视图模板将数据展示在浏览器里. 在开始下一步前,先Build一下应用程序(生 ...
- Ubuntu系统字体安装
用惯了Windows,刚转到Ubuntu时总感觉字体显示没那么亲切,尤其是中文字体,在网页上显示特别怪.有些软件对中文字体的支持也不好,WebStorm中的Git logs中文也显示乱码.把系统语言设 ...
- Mac下安装与配置Go语言开发环境
1.官网下载安装包(需FQ) https://storage.googleapis.com/golang/go1.7.darwin-amd64.pkg 2.配置Go环境变量GOPATH和GOBIN ( ...
- 2013 duilib入门简明教程 -- 界面设计器 DuiDesigner (10)
上一个教程讲解了怎么布局最大化.最小化.关闭按钮,但是如果手动去计算这三个按钮的位置和大小的话,非常的不直观,也很不方便. 所以这一章准备介绍duilib的UI设计器,由于这个设计器很 ...
- String Aop 动态代理例子
动态代理原理:spring AOP采用动态代理来实现 (1)定义一个接口Boy package aop001; public interface Boy { public void beat(Stri ...
- C#设计模式系列:简单工厂模式(Simple Factory)
1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...