在 C# 中的消息框上单击 X 时编写代码

Write code for when the X is clicked on a message box in C#

我在 Visual Studio 2017 年用 C# 编写了一个应用程序。我正在使用 Windows Forms App (.NET Framework)。我有一个带有默认设置的 MessageBox 弹出(只有 OK 按钮和右上角的 X)。当用户选择 "OK" 时,剩余的代码将恢复。当用户选择 X 关闭消息框时,我想向 运行 编写单独的代码。如何判断用户是否单击了 X 以关闭消息框?

我试过使用

DialogResult result = MessageBox.Show("Message here");
if(result != DialogResult.OK){
    //Do stuff here
} 

但即使按下 X,结果仍然返回 Dialog.OK。

我该怎么办?

更新

这段代码工作正常

DialogResult result = MessageBox.Show("Message here", "MessageBoxTitle", MessageBoxButtons.OKCancel);
if(result != DialogResult.OK){
    //Do stuff here
} 

但是,我的消息框现在有一个不必要的取消按钮。有没有一种方法可以仅通过 MessageBoxButtons.OK 设置来实现此目的,从而避免使用“取消”按钮?

这是底层 Win32 MessageBox API 的限制。

API 不提供指定关闭框如何单独工作的方法。单击关闭框(或按 Escape)总是 returns 如果有取消按钮的 ID,如果没有则为默认按钮。

不幸的是,不,您不能通过将默认按钮设置为不存在的按钮来作弊 - 如果您这样做,默认值将被重置为现有按钮之一。

因此,如果您想以比这更复杂的方式处理关闭框,则必须创建自己的对话框,而不是让 ::MessageBox 为您完成。

除了关于WindowsAPI的回答。

System.Windows.Forms.MessageBox.Show("Message") 内部调用私有方法 System.Windows.Forms.ShowCore(...).

方法.Show(text)是这样定义的:

/// <summary>
///  Displays a message box with specified text.
/// </summary>
public static DialogResult Show(string text)
{
    return ShowCore(null, text, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, 0, false);
}

这意味着.Show(text)只是完整方法调用的shorthand版本。因此,您只能获得那些可以通过调用实际 .ShowCore(...) 方法获得的结果。