Это не имеет значения, показывает ли приложение диалоговое окно или нет ... И только приложение, и тестовое приложение Отмените, если e.CloseReason == CloseReason.UserClosing
В этом весь смысл, не имеет значения, показываете ли вы диалог или нет. В первом приложении вы не звоните e.Cancel == true;
вообще, потому что e.CloseReason
не UserClosing
, а WindowsShutDown
.
Согласно документации :
UserClosing
Пользователь закрывает форму через пользовательский интерфейс (UI), для
Например, нажав кнопку Закрыть в окне формы, выбрав
Закрыть из меню управления окна или нажать ALT + F4.
Вы можете подтвердить, что это на самом деле WindowsShutDown
, запустив некоторый простой тест, подобный следующему:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
System.IO.File.WriteAllText(@"D:\SomePath\CloseReason.txt", e.CloseReason.ToString());
if (e.CloseReason == CloseReason.UserClosing) e.Cancel = true;
}
Если вы хотите предотвратить отключение / выход из системы, вы можете установить e.Cancel
на true
без условия или проверить, если e.CloseReason == CloseReason.WindowsShutDown
:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// e.Cancel = true;
// Or..
if (e.CloseReason == CloseReason.UserClosing ||
e.CloseReason == CloseReason.WindowsShutDown)
{
e.Cancel = true;
}
}
Но, пожалуйста, используйте это ответственно и имейте в виду, что пользователь всегда может принудительно выключить / выйти из системы, как объяснено в этом ответе .
Edit:
Если, с другой стороны, у вас есть какая-то логика, которая может помешать закрытию формы (например, путем вызова e.Cancel = true;
), и вы не хотите, чтобы эта логика применялась при выключении (или выходе из системы), я всегда используйте что-то вроде следующего:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.WindowsShutDown) return; // Go ahead and close.
if (!SafeToClose())
{
// Optional:
if (MessageBox.Show("Important process is running. Stay?",...) == DialogResult.Yes)
{
e.Cancel = true;
}
// Or directly:
//e.Cancel = true;
}
}