有没有办法暂停Windows关机,使窗体.关闭方法可以完成



当窗口开始关闭时,我试图将一些信息放在数据库中。在我的申请中,我正在处理表格。关闭事件。然而,Windows将继续并关闭,我的方法没有时间完成。有没有办法让停工暂停足够长的时间来处理停工?这是我目前使用的方法。

Private Sub frmMain_Closing(sender As Object, e As FormClosingEventArgs) Handles Me.Closing
        If e.CloseReason = CloseReason.WindowsShutDown Then
            _logger.Debug("Hit frmMain_Closing1")
            NewEvent(Events.SystemShutdownNormal)
            System.Threading.Thread.Sleep(10000)
            _logger.Debug("Hit frmMain_Closing 2")
        End If
    End Sub

每次我使用_logger.Debug("Hit...")记录两次日志到日志文件,但是,只有第一次调用它才被写入文件。我已经尝试了设置e.Cancel = True的方法,但这似乎不起作用。

很抱歉。简而言之,没有办法延迟或取消Windows关机。它将"很好地"点击所有进程以退出,然后遍历并杀死所有没有退出的进程。您可以延迟关闭,直到进程完成。要做到这一点,您需要使用ShutdownBlockReasonCreate()

您应该挂接WM_QUERYENDSESSION消息,以便获得做某事的机会。你需要重写WinProc,处理消息,然后调用基本的WinProc。看看https://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.sessionending(v=vs.110).aspx(向下滚动到备注)

请记住,Windows不会永远等待,但这将给你一点提前通知。希望你能有机会做你想做的事。优先处理重要的事情,希望它在进程被终止之前完成。

一旦你钩子WM_QUERYENDSESSION,你应该调用ShutdownBlockReasonCreate()阻止关机,直到你的应用程序完成关闭。完成后,调用ShutdownBlockReasonDestroy()。有关详细信息,请参阅这篇MSDN文章(向下滚动到"必须阻止关机的应用程序应使用新的关机原因API")。

可以在这里和这里找到PInvoke声明

最新更新