VB.Net暂停Windows关机或注销

问题描述 投票:1回答:2

我试图在关闭或注销时显示一些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可以继续。

vb.net shutdown logoff
2个回答
1
投票

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

一个潜在的解决方案是为InitiateShutdownInitiateSystemShutdownInitiateSystemShutdownEx函数创建系统范围的钩子(需要C ++或其他一些低级语言)。但是,它们需要仔细编码并进行彻底测试,即使您设法让它们在大多数时间运行,也无法保证操作系统不会通过其他更深层次的功能绕过它们(它包含很多功能)未记录和名称错误的函数)。

资源:

大约两年前我研究了这个问题,试图制作一个程序,如果用户选择完全阻止系统关闭。但是,如上所述,事实证明,即使不是不可能,也是非常困难的。我的尝试都没有成功。


0
投票

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

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

你可以尝试的另一个更黑客的方法是发送一个CTRL+ALT+DEL然后发送任务管理器(然后隐藏它。也许你可以这么快就完成所有这一切,用户只会看到快速闪存)。当我手动完成它时,通常会中止关机。

© www.soinside.com 2019 - 2024. All rights reserved.