Принудительное закрытие приложения при завершении работы системы - PullRequest
27 голосов
/ 15 ноября 2011

У меня есть приложение Windows Forms, которое при закрытии главного окна отображает основное диалоговое окно, подтверждающее действие.Если пользователь решает отменить, приложение отменяется.

Однако, когда приложение работает в свернутом виде и пользователь хочет выключить ПК, последовательность выключений останавливается, поскольку мое приложение ожидает подтверждения от пользователя.закрытие приложения (отображается диалоговое окно).

Я подумал о добавлении таймера для тайм-аута, и если в течение определенного времени не будет получен ответ, автоматически закройте приложение, но даже если этоспособ сделать это, это, конечно, НЕ так, как это делает любое другое приложение.

Итак, какое было бы оптимальное решение для подтверждения завершения работы приложения в любом другом случае, если только система не закрывается?

Спасибо!

Ответы [ 5 ]

47 голосов
/ 15 ноября 2011

В вашем событии FormClosing проверьте свойство FormClosingEventArgs ' CloseReason , чтобы увидеть, почему окно закрывается. Если это CloseReason.WindowsShutDown, то не показывайте свой диалог и не отменяйте закрытие формы.

private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
    // Verify that we're not being closed because windows is shutting down.
    if (e.CloseReason != CloseReason.WindowsShutDown)
    {
        // Show your dialog / cancel closing. 
    }
}

N.B: Возможно, вы также захотите включить CloseReason.TaskManagerClosing, поскольку пользователь явно хочет закрыть ваше приложение в этом сценарии, и менеджер задач уже запрашивает подтверждение. Или, в качестве альтернативы, покажите диалог только для CloseReason.UserClosing.

9 голосов
/ 15 ноября 2011

В обработчике событий Closing, который вы можете определить следующим образом:

    this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);

и там, где я предполагаю, что вы публикуете диалоговое окно подтверждения, вы можете проверить аргумент CloseReason и не публиковать диалоговое окно, если оно вызвано выключением:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.WindowsShutDown)
        {
            //do not show the dialog
        }
    }
6 голосов
/ 15 ноября 2011

SystemEvents может помочь вам.SessionEnding происходит, когда пользователь пытается выйти из системы или завершить работу системы.

Microsoft.Win32.SystemEvents.SessionEnding += (sender, e) => DoYourJob();
1 голос
/ 15 ноября 2011

вы можете использовать Application.SessionEnding Event, чтобы понять, собирается ли система завершить работу

http://msdn.microsoft.com/en-us/library/system.windows.application.sessionending.aspx

0 голосов
/ 15 ноября 2011

Вы можете прослушать событие отключения и выйти из приложения без окна сообщения.

...