Когда «e.Cancel = true» в FormClosing НЕ предотвращает выход из системы? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть приложение Winforms, которое минимизируется до панели задач, когда пользователь нажимает на X. Это не мешает пользователю выйти из системы.

С другой стороны, у меня есть приложение, которое показывает диалоговое окно, когда пользователь нажимает X, и оно делает предотвращение выхода из системы, показывая:

"Это приложение не позволяет вам выйти."

Я пытался отследить, в чем именно заключается разница между ними, но не нашел различия. Я думал, что это будет диалог, но тестовое приложение показало, что в любом случае приложение устанавливает e.Cancel = true; в FormClosing - тестовое приложение предотвращает выход из системы. Не имеет значения, показывает ли приложение диалоговое окно или нет, и если ShowInTaskbar имеет значение true или false. И оба приложения, и тестовое приложение только Cancel, если e.CloseReason == CloseReason.UserClosing.

Итак, в основном я спрашиваю, когда e.Cancel = true не предотвращает выход из системы?

1 Ответ

0 голосов
/ 15 мая 2018

Это не имеет значения, показывает ли приложение диалоговое окно или нет ... И только приложение, и тестовое приложение Отмените, если 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...