【问题标题】:Windows 10 - ShutdownBlockReasonCreate causes shutdown to be canceled after one minuteWindows 10 - ShutdownBlockReasonCreate 导致关机一分钟后取消
【发布时间】:2016-11-15 09:42:24
【问题描述】:

我的应用程序有时可能需要在关机期间执行更长的任务。因此,它通过处理结果值为 0 的 WM_QUERYENDSESSION 来否决关闭,并使用 ShutdownBlockReasonCreate 在应用程序阻止关闭时 Windows 显示的黑色关闭等待屏幕期间显示有意义的消息。

但是,从 Windows 10 开始,此黑屏仅显示一分钟。之后,取消关机,用户返回桌面。为什么会这样,黑屏的寿命是否可以无限延长,就像在 Windows 7 下一样?黑屏应该一直显示,直到所有关闭阻塞原因都被破坏。

【问题讨论】:

    标签: winapi windows-10


    【解决方案1】:

    一个长时间运行的任务是为了在启动关机之前阻止关机发生。如果你有一个不想被关机中断的任务,任务需要在开始时调用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让关机继续,然后在你关闭时运行任务接收WM_ENDSESSION。不要阻止 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 分钟等。您的应用程序的关闭逻辑需要尽可能快,如果这意味着您必须重新设计关闭逻辑以加快速度,那就去做吧。

    【讨论】:

    • 非常感谢!我会检查可以做什么。用例是客户希望在关闭时运行备份作业。他们花费的时间可能会有所不同。我想我会建议让应用程序调用关机,而不是让关机调用应用程序。
    猜你喜欢
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多