我在检测到关闭或登录时尝试显示一些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 Messages停止了"此程序正在阻止您登录您..."。
但是,我希望在收到消息"用户正在关闭/系统关闭"消息后,用户可以选择命令按钮来删除某些内容,然后关闭或登录可以继续。
启动后取消关闭/注销几乎是不可能的。就像您在问题中所说的那样,您最多可以得到"此程序阻止窗口关闭" 。
a 电位解决方案将是为InitiateShutdown
,InitiateSystemShutdown
和InitiateSystemShutdownEx
功能创建系统范围的钩子(需要C 或其他一些低级语言)。但是,他们需要仔细编码并进行彻底的测试,即使您在大多数时间都设法使它们工作,也无法保证操作系统不会通过其他一些,甚至更深的功能绕过它们(其中包含很多
来源:
我研究了此大约两年前的重度,以尝试制作一个程序,该程序将完全阻止用户选择的情况。但是,如上所述,事实证明,它非常困难,即使不是不可能。我的尝试都没有成功。
检测到关机时可以立即调用shutdown /a
。(/a代表"流产")。
这是Windows中的内置命令行实用程序,因此您将其称为呼叫VB应用程序中命令行实用程序的通常方式。诀窍是它必须足够快。
您可以尝试的另一种更刺耳的方法是发送CTRL+ALT+DEL
,然后是任务管理器(然后隐藏它。也许您可以这么快就可以做到这一点,用户只会看到快速闪烁)。当我手动完成时,通常会中止关闭。