我尝试过在检测到关机或注销时显示一些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消息“此程序阻止您注销... ”。
但是,我希望在收到消息“用户正在登录/系统正在关闭”后,用户可以选择命令按钮以执行某些操作,然后关机或注销可以继续。
答案 0 :(得分:1)
启动后取消取消/注销几乎是不可能的。最多可以得到“此程序阻止Windows关闭”消息,就像您在问题中所说的那样。
一种潜在的解决方案是为InitiateShutdown
,InitiateSystemShutdown
和InitiateSystemShutdownEx
函数创建系统范围的钩子(需要C ++或其他一些低端函数级语言)。但是,它们需要进行仔细的编码和彻底的测试,即使您设法使它们在大多数时间都能正常工作,也无法保证操作系统不会通过其他甚至更深层次的功能来绕过它们(它包含许多功能)。未记录的功能和名称被篡改的功能)。
来源:
大约两年前,我对此 进行了深入研究,以期开发出一种可以完全阻止用户关闭系统的程序。但是,如上所述,这被证明是极其困难的,即使不是不可能的。我的尝试都没有成功。
答案 1 :(得分:0)
检测到关机后,您可以立即致电shutdown /a
。 (/ a代表“中止”)。
这是Windows中的内置命令行实用程序,因此您可以将其称为在vb应用程序中调用命令行实用程序的常用方法。诀窍是它必须足够快地发生。
您可以尝试的另一种更骇人听闻的方法是发送CTRL+ALT+DEL
,然后发送任务管理器(然后将其隐藏。也许您可以这么快地完成所有操作,用户只会看到快速闪烁的信息)。通常,当我手动执行关闭操作时,该操作会终止。