有什么方法可以防止Windows使用Python关闭我的系统。所以我无法在运行Python脚本时关闭系统?
答案 0 :(得分:0)
是的。
从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,并且我也不想在未经测试的情况下共享代码,但是我希望我指出了您应该寻找的内容。