使用自定义消息防止 Windows 关机

Posted

技术标签:

【中文标题】使用自定义消息防止 Windows 关机【英文标题】:Prevent Windows shutdown with custom message 【发布时间】:2011-11-24 04:17:18 【问题描述】:

当我在虚拟机运行时尝试关闭 Windows 时,VMWare Workstation 的表现非常酷:

通常,我们会看到“此程序正在阻止 Windows 关闭”消息,而不是新的“1 个虚拟机正在使用中”。

VMWare 如何做到这一点?我在 Google 上找不到任何关于它的 API。

【问题讨论】:

我知道在命令行中使用shutdown命令时可以指定自定义关闭消息来显示,也许这有关系? 【参考方案1】:

您可以阅读有关 Vista here 中引入的所有更改。你真的应该非常仔细地阅读那篇文章。

您正在寻找的 API 是 ShutdownBlockReasonCreateShutdownBlockReasonDestroyShutdownBlockReasonQuery。请记住,这些 API 仅在 Vista/2008 服务器上可用。您必须在 2000/XP 上实现回退行为。

如果您需要阻止关机,您可以调用ShutdownBlockReasonCreate 将句柄传递给您的主窗口,并将原因作为字符串传递。该字符串是关闭阻止对话框中显示的内容,即屏幕截图中的“1 virtual machine is in use”。

如果阻止关机的操作完成,则调用ShutdownBlockReasonDestroy

请注意,您仍然必须实现 WM_QUERYENDSESSION 以使所有部分组合在一起。这是真正阻止关机的部分。

在 XP 上,您还应该回复 WM_ENDSESSION,如果您的应用程序被阻止关闭,则显示一条说明原因的消息是礼貌的。如果您不这样做,那么用户就只能摸不着头脑,为什么计算机会忽略关机指令。

【讨论】:

Don't forget to respond to WM_QUERYENDSESSION. 啊,谢谢!我通过谷歌找到了这些,但文档并没有做太多的事情来指出它会影响 UI,所以我认为消息会显示出来,例如,使用消息框。 关键是我在答案的第一句话中链接到的论述文章。这是您处理关机的指南。 API 文档总是更简洁一些。

以上是关于使用自定义消息防止 Windows 关机的主要内容,如果未能解决你的问题,请参考以下文章

在Windows登录中登录失败后添加自定义错误消息

MFC自定义消息使用

AWS - 自定义拒绝消息

win32 用户自定义消息范围

MFC自定义消息的方法?

MFC中用户自定义类响应自定义消息