【问题标题】:VB.Net Pausing Windows Shutdown or LogoffVB.Net 暂停 Windows 关机或注销
【发布时间】:2019-02-15 20:21:36
【问题描述】:

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

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

【问题讨论】:

    标签: vb.net shutdown logoff


    【解决方案1】:

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

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

    来源:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • shutdown /a 调用 AbortSystemShutdown function 只能中断设置为超时的关机。除了显示 “此程序正在阻止 Windows 关闭” 消息(通过方式,也可以通过将InitiateSystemShutdown中的bForceAppsClosed设置为True来跳过)。
      • 您的第二个建议恐怕也是不可能的,因为CTRL + ALT + DEL 屏幕运行在一个名为“安全桌面” 的单独桌面中(类似于 UAC 提示) 旨在能够在应用程序/进程/shell 之间创建障碍。只有当前活动桌面中的进程才能与鼠标和键盘交互(直接或通过模拟),这意味着当显示CTRL + ALT + DEL 屏幕时,您的应用程序将无法再检测或模拟击键,因为它在不同的桌面上运行.此外,由于这是一个系统拥有的桌面,它包括额外的保护。
      • 关于桌面的更多信息,我推荐阅读How does the Windows "Secure Desktop" mode work?Desktops | Microsoft Docs
      猜你喜欢
      • 2013-08-23
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      相关资源
      最近更新 更多