首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >消失的FormClosing/FormClosed事件

消失的FormClosing/FormClosed事件
EN

Stack Overflow用户
提问于 2012-10-15 08:41:36
回答 1查看 954关注 0票数 0

下面的代码片段看起来可能很奇怪,但它是一种非常简单的方法来重现与不同应用程序的复杂交互问题。

示例应用程序有两个表单,两个表单都注册了FormClosing和FormClosed事件,只是在那里执行一个Debug.WriteLine。

主要职能是:

代码语言:javascript
复制
[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Form2 form2 = new Form2();
    form2.Show();
    Application.Run(new Form1());
}

当我关闭Form2时,我会收到预期的事件。当我关闭Form1时,应用程序退出,Form2也被关闭。但是: Form2事件并没有发生。

我骑过了WndProc of Form2。当我关闭Form2时,我收到

代码语言:javascript
复制
15.10.2012 10:25:04 WndProc - WM_CLOSE
15.10.2012 10:25:04 OnClosing
15.10.2012 10:25:04 Form2_FormClosing
15.10.2012 10:25:04 OnClosed
15.10.2012 10:25:04 Form2_FormClosed
...
15.10.2012 10:25:04 WndProc - WM_DESTROY
...
15.10.2012 10:25:04 WndProc - WM_NCDESTROY

当我关闭Form1时,Form2不接收WM_CLOSE。但是接收到了WM_DESTROY和WM_NCDESTROY。

编辑:获得这种奇怪行为的另一种方式如下:项目有三种形式,Form1和Form2都有一个按钮来打开下一个表单。在单击form2事件的按钮中,请执行以下操作:

代码语言:javascript
复制
Form3 frm3 = new Form3();
frm3.Parent = null;
frm3.Show(null);

同样,如前所述,注册事件处理程序。关闭form2时,应用程序保持运行(仍然显示form1),但form3也关闭,没有收到WM_CLOSE事件。注意,我已经将表单的父级和所有者设置为null。

这种奇怪行为的原因是什么?

EN

回答 1

Stack Overflow用户

发布于 2012-10-15 08:51:56

WM_CLOSE消息被发送到有取消关闭的选项。见此流程图:

所以,在这个消息中没有必要,当窗口即将被摧毁的时候。这是故意的行为。关闭主要应用程序形式时,将调用Application.ThreadExit方法。它描述为:

退出当前线程上的消息循环并关闭线程上的所有窗口。

如果希望所有打开的表单都接收WM_CLOSE消息,则需要使用Application.Exit

通知所有邮件泵必须终止,然后在消息处理后关闭所有应用程序窗口。

因此,只需订阅Form1_FormClosing事件并通知所有打开的窗口关闭:

代码语言:javascript
复制
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    Application.Exit();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12891998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档