Напишите код для щелчка X в окне сообщения на C#.

Я пишу приложение на C# в Visual Studio 2017. Я использую приложение Windows Forms (.NET Framework). У меня появляется всплывающее окно MessageBox с настройками по умолчанию (только кнопка OK и X в правом верхнем углу). Когда пользователь выбирает «ОК», оставшийся код возобновляется. Я хочу написать отдельный код для запуска, когда пользователь выбирает 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, чтобы я не использовал кнопку «Отмена»?


person Susi    schedule 03.12.2019    source источник
comment
API, который вы используете (WinForm, ASP.NET, WPF, UWP), важнее знать, чем используемый вами язык или IDE.   -  person Dour High Arch    schedule 04.12.2019
comment
Этот код должен работать....   -  person Isma    schedule 04.12.2019
comment
Используйте отладчик, чтобы увидеть, какое значение имеет оператор if.   -  person Jawad    schedule 04.12.2019
comment
Хорошо. Я использую приложение Windows Forms (.NET Framework).   -  person Susi    schedule 04.12.2019
comment
@MarcusLai, я использовал отладчик, и он сказал, что результат имеет значение OK.   -  person Susi    schedule 04.12.2019
comment
Есть ли причина не указывать параметры MessageBox для использования Ok/Cancel? Тогда ненормальные сообщения по умолчанию отменяются, я полагаю.   -  person Ethan DeLong    schedule 04.12.2019
comment
@EthanDeLong Когда я использовал MessageBoxButtons.OK по умолчанию, нажатие на X приводило к диалоговому ответу DialogResult.OK. Когда я использую MessageBoxButtons.OKCancel, щелчок по X приводил к диалоговому ответу DialogResult.Cancel. Однако мне не нужна дополнительная кнопка «Отмена» в окне сообщения, если ее можно избежать.   -  person Susi    schedule 04.12.2019


Ответы (2)


Это ограничение базового API Win32 MessageBox. .

API не позволяет отдельно указать, как работает поле «Закрыть». Нажатие на поле «Закрыть» (или нажатие Escape) всегда возвращает идентификатор кнопки «Отмена», если она есть, или кнопку по умолчанию, если ее нет.

И, к сожалению, нет, вы не можете пытаться обмануть, установив кнопку по умолчанию на несуществующую кнопку — если вы это сделаете, по умолчанию будет сброшена одна из существующих кнопок.

Поэтому, если вы хотите обрабатывать окно Close более сложным способом, вам придется создать собственное диалоговое окно, а не позволять ::MessageBox делать это за вас.

person Mark Phaedrus    schedule 03.12.2019
comment
Хорошо, спасибо за подробное объяснение! Я буду придерживаться своего обходного пути и пока оставлю кнопку отмены. - person Susi; 04.12.2019

В дополнение к ответу о 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(...).

person Vladimir Serykh    schedule 03.12.2019