Windows 10 - ShutdownBlockReasonCreate导致关机一分钟后取消

问题描述:

我的应用程序有时可能需要在关机期间执行较长的任务。所以它通过处理WM_QUERYENDSESSION结果值为0来否决关闭,并在Windows显示应用程序阻止关闭的黑色关机等待屏幕期间使用ShutdownBlockReasonCreate显示有意义的消息。Windows 10 - ShutdownBlockReasonCreate导致关机一分钟后取消

但是,从Windows 10开始,这个黑屏只显示一分钟。之后,关闭被取消并且用户返回到桌面。为什么会这样,黑屏的生活可以无限期延长,就像在Windows 7下一样?应该显示黑色屏幕,直到所有关闭块原因被破坏。

长时间运行的任务旨在阻止关机发生之前关机启动。如果您的任务不想被关机中断,则任务需要在开始时拨打ShutdownBlockReasonCreate(),完成后请拨ShutdownBlockReasonDestroy()。尽管如此,用户仍然可以使用强制关闭。

但是一旦启动关闭,它就不能被阻塞,并且在操作系统介入强制关闭之前它可以被延长很短的时间。如果你能避免它,关机是一个糟糕的时间开始一个新的长时间运行的任务。

参阅MSDN了解更多详情:

Application Shutdown Changes in Windows Vista

Changes to power management in Windows Vista

Now that Windows makes it harder for your program to block shutdown, how do you block shutdown?

最起码,如果你需要一个较长的时间段关机时运行任务,当您收到WM_QUERYENDESSION时,应该调用ShutdownBlockReasonCreate(),并返回TRUE以使关机继续,然后在收到时运行任务10。不要阻止WM_QUERYENDESSION超过几秒钟,否则Windows将更有可能介入并终止您的应用程序。

这也很重要,因为在您的应用对WM_QUERYENDSESSION返回TRUE后,关机可能不会真正进行。当发送WM_QUERYENDSESSION时,Windows正在询问您的应用程序是否有权关闭(或者告诉它即将关闭关机程序),但它尚未关闭。当你的应用收到WM_ENDSESSION时,它知道关机实际上正在执行(以及为什么)。该流程在MSDN上还介绍:

Shutdown Changes for Windows Vista

Restart Manager | Guidelines for Applications

即使你遵循这些原则时,Windows仍然不会让您阻止无限期关闭。它可能会给你额外的30秒,1分钟等等。你的应用程序的关机逻辑需要尽可能快,如果这意味着你将不得不重新设计你的关机逻辑来加速它,那就去做吧。

+0

非常感谢!我会检查可以做些什么。用例是客户希望在关闭时运行备份作业。他们的时间可能会有所不同。我想我会建议让应用程序调用关闭,而不是让关闭调用应用程序。 – superflexible