为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Python 3 阻止 Windows 10 关机

使用 Python 3 阻止 Windows 10 关机

森林海 2021-11-16 16:41:38
有什么办法可以防止 Windows 用 Python 关闭我的系统。所以我不能在我的 Python 脚本运行时关闭我的系统?
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

就在这里。

来自 Windows 文档

关机通知

具有窗口和消息队列的应用程序通过 WM_QUERYENDSESSION 和 WM_ENDSESSION 消息接收关闭通知。这些应用程序应返回 TRUE 以指示它们可以被终止。除非绝对必要,否则应用程序不应阻止系统关闭。应用程序应在处理 WM_ENDSESSION 时执行任何所需的清理工作。具有未保存数据的应用程序可以将数据保存到一个临时位置,并在应用程序下次启动时恢复它。建议应用程序经常保存它们的数据和状态;例如,在用户发起的保存操作之间自动保存数据,以减少关机时要保存的数据量。控制台应用程序在其处理程序例程中接收关闭通知。要注册控制台处理程序,使用 SetConsoleCtrlHandler 函数。服务应用程序在其处理程序例程中接收关闭通知。要注册服务控制处理程序,请使用 RegisterServiceCtrlHandlerEx 函数。

阻塞关机

如果应用程序必须阻止潜在的系统关闭,它可以调用 ShutdownBlockReasonCreate 函数。调用者提供将显示给用户的原因字符串。原因字符串应简短明了,为用户提供决定是否继续关闭系统所需的信息。

所以你必须拦截 WM_QUERYENDSESSION 消息并返回 False 。

并进行了一些网络搜索,我发现了有关如何在 python 中拦截 WM_QUERYENDSESSION 的讨论:

如果您构建了一个带有消息循环的应用程序,您可以收到 WM_QUERYENDSESSION 消息。如果您想要一个 GUI,大多数 GUI 库可能会以自己的方式进行包装。如果您不需要 GUI,您最简单的解决方案可能是使用 PyWin32。在文档的某处有一个关于创建隐藏窗口和编写简单消息循环的教程。只需在主线程上执行此操作,然后在后台线程上执行您的实际工作,并在收到 WM_QUERYENDSESSION 消息时通知您的后台线程。

或者,更简单的是,只需使用 SetConsoleCtrlHandler(再次通过 PyWin32)。这也可以捕获 ^C、^BREAK 和关闭控制台的用户,以及 WM_QUERYENDSESSION 捕获的注销和关闭消息。更重要的是,它不需要消息循环,因此如果您没有任何其他需要,那就简单多了。

我无法提供代码片段,因为我无法访问 Windows pc,而且我不想在没有测试的情况下共享代码,但我希望我向您指出了您应该寻找的内容。


查看完整回答
反对 回复 2021-11-16
  • 1 回答
  • 0 关注
  • 1113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信