OriginalGriff
Когда я попробую это сделать (исправив ваш код так, чтобы он компилировался):
DialogResult result = MessageBox.Show(this, "Please confirm", "Are you sure to exit the application", MessageBoxButtons.YesNo);
Или
DialogResult result = MessageBox.Show("Please confirm", "Are you sure to exit the application", MessageBoxButtons.YesNo);
Результат тот же: вы не можете нажать кнопку "X", чтобы закрыть диалоговое окно, оно неактивно.
И попытка нажать кнопку "X" на главной форме тоже не работает - потому что диалоговое окно является модальным, и основная форма не будет реагировать, пока она не будет закрыта.
Так что же именно вы делаете по - другому-потому что я подозреваю, что ваш код не похож на то, что вы нам показали...
"Я думаю, что он нажимает на значок панели задач, который предлагает крошечный красный крестик, чтобы закрыть приложение "снаружи""
"да"
А!
В этом случае все просто: обработайте событие FormClosing и покажите окно сообщения из него: вы можете отменить закрытие с помощью FormClosingEventArgs.свойство Cancel
"I have tried that. But, issue is still exist.
In 'Cancel' button event, i have added FormClosingEventArgs.Cancel= false;
Then In Form Closing event, added the Message box to display.
When i clicked on cancel button, message box displayed. Then again i have clicked on task bar icon close window, focus is moving from message box to Main Window.
"
Я сам попробовал это сделать, изменив существующее приложение:
/// <summary>
/// Save the size and location (if the used doesn't
/// override it)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("Please confirm", "Are you sure to exit the application", MessageBoxButtons.YesNo);
if (result != DialogResult.Yes)
{
e.Cancel = true;
return;
}
if ((ModifierKeys & Keys.Shift) == 0)
{
this.SaveLocation();
}
}
Я запускаю приложение, навожу курсор мыши на панель задач и нажимаю "X" - появляется окно сообщения.
Если я затем снова наведу курсор мыши на панель задач, то получу два окна предварительного просмотра и смогу переключить фокус на "основную" форму из диалогового окна, но ничего не смогу с ней сделать - все, что я получу, это звуковой сигнал по умолчанию, если попытаюсь.
Я подозреваю, что это "особенность" windows, и нет никакого реального способа избавиться от нее.
Так что...вам придется обойти это.
Потерпи меня здесь...
Начните с добавления новой формы в ваш проект - назовите ее MyMessageBox
Установите подпись, добавьте метку, чтобы предложить пользователю закрыть ее, и добавьте две кнопки: вызовите одну "butYes", другую "butNo" и установите текст соответствующим образом. Установите для свойства DialogResult для каждой кнопки значения "да" и "нет" соответственно.
Задайте свойства формы "AcceptButton" в "butYes", и "кнопку Отменить" на "но".
Задайте свойства формы "ShowInTaskBar" на "false", и "StartPosition" в "CenterParent".
Теперь вернитесь к своей основной форме и добавьте две частные переменные класса:
private bool checkClosing = false;
private MyMessageBox closeConfirm = null;
Измените обработчик событий FormClosing:
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
checkClosing = true;
closeConfirm = new MyMessageBox();
DialogResult result = closeConfirm.ShowDialog();
checkClosing = false;
closeConfirm = null;
if (result != DialogResult.Yes)
{
e.Cancel = true;
return;
}
}
(Технически, вы только нуждаетесь в closeConfirm переменной, но...)
Теперь добавьте новый обработчик событий формы: активирован
private void frmMain_Activated(object sender, EventArgs e)
{
if (checkClosing && closeConfirm != null)
{
closeConfirm.Activate();
}
}
Скомпилируйте и попробуйте его.