有没有办法暂停Windows关闭,以便form.closing方法可以完成?

时间:2016-10-13 17:35:12

标签: vb.net windows winforms

当Windows开始关闭时,我试图将一些信息放在数据库中。在我的应用程序中,我正在处理Form.Closing事件。但是,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的方法,但这似乎不起作用。

1 个答案:

答案 0 :(得分:2)

抱歉这个错误。 简而言之,无法延迟或取消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()。有关详细信息,请参阅this MSDN article(向下滚动到"必须阻止关闭的应用程序应使用新的关闭原因API")。

PInvoke声明可以是found herehere