1

我尝试在检测到关机或注销时显示一些 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 消息“此程序正在阻止您注销...”。

但是,我希望在收到消息“用户正在登录/系统正在关闭”后,用户可以选择命令按钮来处理某些事情,然后关闭或注销可以继续。

4

2 回答 2

1

在启动后取消关闭/注销几乎是不可能的。就像您在问题中所说的那样,您最多可以收到“此程序正在阻止 Windows 关闭”消息。

一个潜在的解决方案是为InitiateShutdown,InitiateSystemShutdownInitiateSystemShutdownEx函数创建系统范围的钩子(需要 C++ 或其他某种低级语言)。但是,它们需要仔细编码和彻底测试,即使你设法让它们在大多数情况下工作,也不能保证操作系统不会通过其他一些甚至更深层次的功能绕过它们(它包含很多未记录和名称损坏的函数)。

资源:

大约两年前,我对此进行了大量研究,试图制作一个如果用户选择完全阻止系统关闭的程序。然而,如上所述,它已被证明是极其困难的,如果不是不可能的话。我的尝试都没有成功。

于 2019-02-15T20:58:26.073 回答
0

shutdown /a当检测到关机时,您可以立即调用。(/a 代表“中止”)。

这是 Windows 中的内置命令行实用程序,因此您可以将其称为在 vb 应用程序中调用命令行实用程序的常用方式。诀窍是它必须发生得足够快。

您可以尝试的另一种更骇人听闻的方法是发送 aCTRL+ALT+DEL然后发送任务管理器(然后将其隐藏。也许您可以快速完成所有操作,用户只会看到快速闪烁)。当我手动完成时,这通常会中止关机。

于 2019-02-16T13:16:50.623 回答