Принудительное закрытие приложения при завершении работы системы

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

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

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

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

спасибо!

5 ответов


в Вашем событии 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 поскольку пользователь явно хочет закрыть ваше приложение в этом сценарии, и taskmanager уже запрашивает подтверждение. Или в качестве альтернативы только показать диалог для CloseReason.UserClosing.


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

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

и где, я думаю, вы публикуете свой диалог подтверждения, Вы можете проверить аргумент theCloseReason, а не публиковать диалог, если это завершение работы, которое вызывает его:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.WindowsShutDown)
        {
            //do not show the dialog
        }
    }

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

Microsoft.Win32.SystemEvents.SessionEnding += (sender, e) => DoYourJob();

вы можете использовать приложение.Событие SessionEnding понять, если система отключения

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


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