VB.Net暂停Windows关闭或注销

VB.Net暂停Windows关闭或注销,vb.net,shutdown,logoff,Vb.net,Shutdown,Logoff,我尝试在检测到关机或注销时显示一些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 Pu

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


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

在关机/注销启动后,几乎不可能取消关机/注销。最多您可以获得正如您在问题中所说,此程序正在阻止Windows关闭”消息

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

来源:


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

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

这是Windows中内置的命令行实用程序,所以你可以称之为vb应用程序中调用命令行实用程序的常用方法。诀窍是它必须足够快


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

shutdown/a
调用,该调用只能中断设置了超时的关机。立即关机(通过调用
InitiateSystemShutdown
而不超时或仅从“开始”菜单关闭)只能通过显示此程序正在阻止Windows关闭”消息(顺便说一句,在
InitiateSystemShutdown
中将
bForceAppsClosed
设置为True也可以跳过该消息)。您的第二个建议恐怕也是不可能的,因为
CTRL+ALT+DEL
屏幕在称为“安全桌面”的单独桌面上运行(类似于UAC提示符)设计用于在应用程序/进程/外壳之间创建屏障。只有当前活动桌面中的进程才能交互(直接交互或通过模拟方式)使用鼠标和键盘,这意味着当显示
CTRL+ALT+DEL
屏幕时,您的应用程序无法再检测或模拟按键,因为它运行在不同的桌面上。此外,由于这是系统所有的桌面,它还包括额外的保护。有关桌面的更多信息,我建议阅读和。