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

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

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

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

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

Спасибо!


person Jano Rajmond    schedule 15.11.2011    source источник


Ответы (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. 
    }
}

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

person Johannes Kommer    schedule 15.11.2011
comment
Спасибо, большое. Это мне очень помогло! - person Jano Rajmond; 15.11.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
        }
    }
person zmilojko    schedule 15.11.2011

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

Microsoft.Win32.SystemEvents.SessionEnding += (sender, e) => DoYourJob();
person JiBéDoublevé    schedule 15.11.2011
comment
То же самое, полезно для моей ситуации - предоставить замену пользовательского интерфейса для приложения, в котором отсутствует проверка, а компьютер настолько заблокирован, что вы не сможете перезапустить приложение, если закроете его. - person Roger Willcocks; 06.03.2014

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

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

person Massimiliano Peluso    schedule 15.11.2011

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

person H-Man2    schedule 15.11.2011