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 "Эта программа не позволяет вам выйти из системы...".
Однако мне хотелось бы, чтобы после получения сообщения "Пользователь входит в систему / Система выключается", пользователь может выбрать командную кнопку для обработки чего-либо, а затем продолжить работу или завершить сеанс.
2 ответа
Отменить выключение / выход из системы после его запуска практически невозможно. Самое большее, вы можете получить сообщение "Эта программа не позволяет Windows завершить работу", как вы сказали в своем вопросе.
Потенциальным решением будет создание общесистемных хуков для InitiateShutdown
, InitiateSystemShutdown
а также InitiateSystemShutdownEx
функции (требуется C++ или какой-либо другой язык низкого уровня). Однако их нужно будет тщательно кодировать и тщательно тестировать, и даже если вам удастся заставить их работать большую часть времени, нет гарантии, что ОС не обходит их через некоторые другие, даже более глубокие функции (она содержит много как недокументированных, так и именованных функций).
Источник:
Я тщательно исследовал это около двух лет назад, пытаясь создать программу, которая полностью блокировала бы выключение системы, если бы пользователь захотел. Однако, как упомянуто выше, это оказалось чрезвычайно трудным, если не невозможным. Ни одна из моих попыток не увенчалась успехом.
Вы могли бы немедленно позвонить shutdown /a
когда отключение обнаружено. (/ означает "прервать").
Это встроенная утилита командной строки в Windows, так что вы бы назвали ее обычным способом вызова утилит командной строки в приложении vb. Хитрость в том, что это должно произойти достаточно быстро.
Еще один более хакерский способ - отправить CTRL+ALT+DEL
а затем диспетчер задач (а затем скрыть его. Может быть, вы можете сделать все это так быстро, что пользователь увидит только быструю вспышку). Это обычно прерывает выключение, когда я делаю это вручную.