单击红色关闭 (x) 按钮和调用 .Close() 有啥区别?

Posted

技术标签:

【中文标题】单击红色关闭 (x) 按钮和调用 .Close() 有啥区别?【英文标题】:What's the difference between clicking the red close (x) button, and calling .Close()?单击红色关闭 (x) 按钮和调用 .Close() 有什么区别? 【发布时间】:2015-11-10 11:26:47 【问题描述】:

我有一个 winforms 应用程序,在我的应用程序中,我创建了一个自定义表单。此自定义 from 在右上角具有默认的关闭、最小化和最大化按钮。如果我使用默认的红色 x 按钮关闭表单,它会正常关闭,没有问题。但是,如果我尝试通过在表单上调用 .Close() 来关闭表单,则会引发未处理的 InvalidOperationException 异常。

调用 .Close() 和单击该按钮有什么区别?为什么点击按钮可以正常工作,但调用 .Close() 会抛出异常?

【问题讨论】:

当您收到异常时,您可以轻松查看堆栈跟踪。此信息对于了解导致异常的原因至关重要。您可以在此处添加该信息 @Steve 没有堆栈跟踪。应用程序不会崩溃或抛出异常。我知道它正在发生的唯一方法是因为输出显示以下行:“System.Windows.Forms.dll 中发生了‘System.InvalidOperationException’类型的第一次机会异常” @Steve,我知道这是因为表单没有关闭。 @TylerJones 那时您可能正在抑制异常。有没有可以在测试期间注释掉的 try/catch 子句?可能需要显示您的一些代码... @NathanA 不,任何有问题的代码周围都没有尝试/捕获。 【参考方案1】:

您可以使用TOOLS->Spy++ 记录窗口消息。

来自: http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Form.cs,b6605a5b113b45f7

Form.Close() 方法调用:

closeReason = CloseReason.UserClosing;
SendMessage(NativeMethods.WM_CLOSE, 0, 0);

另外,尝试搜索异常消息: https://www.google.com/search?q=Form+C%23+A+first+chance+exception+of+type++webbrowser&ie=utf-8&oe=utf-8

想出了这个链接:

C# : "A first chance exception of type 'System.InvalidOperationException'"

【讨论】:

以上是关于单击红色关闭 (x) 按钮和调用 .Close() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Extjs 窗口关闭事件

如何在 python Turtle 图形中检测 X(关闭)按钮?

获取非客户端“关闭”按钮的 hWnd [x] (win32)

C# winform 点击一个按钮退出窗体 并关闭相应的进程

单击按钮关闭 JFrame [重复]

在 PyQt 主窗口中处理关闭按钮的正确方法,(红色“X”)