VB.Net приостанавливает завершение работы Windows или выход из системы

Я пробовал это, чтобы показывать MsgBox при обнаружении выключения или выхода из системы .. например: «Вы выходите из системы ...

    Public Class frmDetectEnd
Private Sub frmDetectEnd_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    AddHandler Microsoft.Win32.SystemEvents.SessionEnding, AddressOf Handler_SessionEnding
End Sub

Public Sub Handler_SessionEnding(ByVal sender As Object, ByVal e As Microsoft.Win32.SessionEndingEventArgs)
    If e.Reason = Microsoft.Win32.SessionEndReasons.Logoff Then
        MessageBox.Show("User is logging off")
    ElseIf e.Reason = Microsoft.Win32.SessionEndReasons.SystemShutdown Then
        MessageBox.Show("System is shutting down")
    End If
End Sub
End Class

Это обнаружение работает нормально, но я хочу остановить процесс выключения / выхода, если отображается MsgBox, потому что в этот момент выполняется процесс выключения / выхода, и он останавливается с сообщением Windows «Эта программа не позволяет вам выйти из системы ...».

Однако я бы хотел, чтобы после получения сообщения «Пользователь ведет журнал / Система завершает работу» пользователь мог выбрать командную кнопку для обработки чего-либо, а затем завершить работу или выйти из системы.


person Erik Hrast    schedule 15.02.2019    source источник


Ответы (2)


Практически невозможно отменить выключение / выход из системы после его запуска. В лучшем случае вы можете получить сообщение «Эта программа предотвращает завершение работы Windows», как вы сказали в своем вопросе.

потенциальным решением может быть создание общесистемных перехватчиков для _ 1_, _ 2_ и InitiateSystemShutdownEx функций (требуется C ++ или другой язык низкого уровня). Однако их нужно будет тщательно закодировать и тщательно протестировать, и даже если вам удавалось заставить их работать большую часть времени, нет гарантии, что ОС не будет обходить их через какие-то другие, даже более глубокие функции (она содержит много как недокументированных, так и измененных функций).

Источник:

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

person Visual Vincent    schedule 15.02.2019

Вы можете немедленно вызвать shutdown /a при обнаружении выключения. (/ a означает «прерывание»).

Это встроенная утилита командной строки в Windows, поэтому вы бы назвали ее обычным способом вызова утилит командной строки в приложении vb. Уловка в том, что это должно произойти достаточно быстро.

Еще один более хитрый способ, который вы могли бы попробовать, - это отправить CTRL+ALT+DEL, а затем диспетчер задач (а затем скрыть его. Может быть, вы сможете сделать все так быстро, что пользователь увидит только быструю вспышку). Обычно это прерывает завершение работы, если я сделал это вручную.

person J. Scott Elblein    schedule 16.02.2019
comment
shutdown /a вызывает AbortSystemShutdown функцию, которая может только прервать завершение работы, для которого был установлен тайм-аут. Немедленное завершение работы (вызовом InitiateSystemShutdown без тайм-аута или просто завершением работы из меню «Пуск») не может быть прервано, кроме как отображением сообщения Эта программа не позволяет Windows завершить работу (которое, кстати, может также можно пропустить, установив для bForceAppsClosed значение True в InitiateSystemShutdown). - person Visual Vincent; 16.02.2019
comment
Боюсь, что ваше второе предложение также невозможно, поскольку экран CTRL + ALT + DEL работает на отдельном рабочем столе, который называется безопасным рабочим столом (аналогично подсказке UAC), предназначенный для создания барьеров между приложениями / процессами. / снаряды. Только процессы на текущем активном рабочем столе могут взаимодействовать (как напрямую, так и посредством моделирования) с мышью и клавиатурой, то есть, когда отображается экран CTRL + ALT + DEL, ваше приложение больше не может обнаруживать или моделировать нажатия клавиш, поскольку оно выполняется на другом рабочем столе. Кроме того, поскольку это системный рабочий стол, он включает дополнительную защиту. - person Visual Vincent; 16.02.2019
comment
Для получения дополнительной информации о настольных компьютерах я рекомендую прочитать Как работает режим безопасного рабочего стола Windows? и Настольные компьютеры | Документы Microsoft. - person Visual Vincent; 16.02.2019