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