2

我在 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 设置来实现这一点,这样我就可以避免使用 Cancel 按钮?

4

2 回答 2

4

这是底层Win32 MessageBox API的限制。

API 没有提供一种方法来指定关闭框如何单独工作。单击关闭框(或按 Escape)始终返回取消按钮的 ID(如果有),如果没有则返回默认按钮。

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

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

于 2019-12-03T21:43:46.783 回答
1

除了关于 Windows API 的答案。

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)只是完整方法调用的简写版本。因此,您只能获得那些可以通过调用实际.ShowCore(...)方法获得的结果。

于 2019-12-03T22:08:51.393 回答