Подтвердить что ты не робот

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

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

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

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

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

Спасибо!

4b9b3361

Ответ 1

В вашем событии 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.

Ответ 2

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

    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
        }
    }

Ответ 3

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

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