1 回答

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,而且我不想在沒有測試的情況下共享代碼,但我希望我向您指出了您應該尋找的內容。
添加回答
舉報