有什么办法可以暂停一个Windows关机,以便一个forms.closing方法可以完成?

我试图在Windows开始closures时将一些信息放入数据库中。 在我的应用程序中,我正在处理Form.Closing事件。 但是,Windows将继续并closures,我的方法没有时间来完成。 有什么办法可以暂停关机足够长的时间来处理关机? 这是我目前使用的方法。

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...")logging两次到一个日志文件但是,只有我第一次调用它被写入文件。 我已经尝试了设置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声明可以在这里和这里 找到 。