1 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
就在這里。
來(lái)自 Windows 文檔
關(guān)機(jī)通知
具有窗口和消息隊(duì)列的應(yīng)用程序通過 WM_QUERYENDSESSION 和 WM_ENDSESSION 消息接收關(guān)閉通知。這些應(yīng)用程序應(yīng)返回 TRUE 以指示它們可以被終止。除非絕對(duì)必要,否則應(yīng)用程序不應(yīng)阻止系統(tǒng)關(guān)閉。應(yīng)用程序應(yīng)在處理 WM_ENDSESSION 時(shí)執(zhí)行任何所需的清理工作。具有未保存數(shù)據(jù)的應(yīng)用程序可以將數(shù)據(jù)保存到一個(gè)臨時(shí)位置,并在應(yīng)用程序下次啟動(dòng)時(shí)恢復(fù)它。建議應(yīng)用程序經(jīng)常保存它們的數(shù)據(jù)和狀態(tài);例如,在用戶發(fā)起的保存操作之間自動(dòng)保存數(shù)據(jù),以減少關(guān)機(jī)時(shí)要保存的數(shù)據(jù)量。控制臺(tái)應(yīng)用程序在其處理程序例程中接收關(guān)閉通知。要注冊(cè)控制臺(tái)處理程序,使用 SetConsoleCtrlHandler 函數(shù)。服務(wù)應(yīng)用程序在其處理程序例程中接收關(guān)閉通知。要注冊(cè)服務(wù)控制處理程序,請(qǐng)使用 RegisterServiceCtrlHandlerEx 函數(shù)。
阻塞關(guān)機(jī)
如果應(yīng)用程序必須阻止?jié)撛诘南到y(tǒng)關(guān)閉,它可以調(diào)用 ShutdownBlockReasonCreate 函數(shù)。調(diào)用者提供將顯示給用戶的原因字符串。原因字符串應(yīng)簡(jiǎn)短明了,為用戶提供決定是否繼續(xù)關(guān)閉系統(tǒng)所需的信息。
所以你必須攔截 WM_QUERYENDSESSION 消息并返回 False 。
并進(jìn)行了一些網(wǎng)絡(luò)搜索,我發(fā)現(xiàn)了有關(guān)如何在 python 中攔截 WM_QUERYENDSESSION 的討論:
如果您構(gòu)建了一個(gè)帶有消息循環(huán)的應(yīng)用程序,您可以收到 WM_QUERYENDSESSION 消息。如果您想要一個(gè) GUI,大多數(shù) GUI 庫(kù)可能會(huì)以自己的方式進(jìn)行包裝。如果您不需要 GUI,您最簡(jiǎn)單的解決方案可能是使用 PyWin32。在文檔的某處有一個(gè)關(guān)于創(chuàng)建隱藏窗口和編寫簡(jiǎn)單消息循環(huán)的教程。只需在主線程上執(zhí)行此操作,然后在后臺(tái)線程上執(zhí)行您的實(shí)際工作,并在收到 WM_QUERYENDSESSION 消息時(shí)通知您的后臺(tái)線程。
或者,更簡(jiǎn)單的是,只需使用 SetConsoleCtrlHandler(再次通過 PyWin32)。這也可以捕獲 ^C、^BREAK 和關(guān)閉控制臺(tái)的用戶,以及 WM_QUERYENDSESSION 捕獲的注銷和關(guān)閉消息。更重要的是,它不需要消息循環(huán),因此如果您沒有任何其他需要,那就簡(jiǎn)單多了。
我無(wú)法提供代碼片段,因?yàn)槲覠o(wú)法訪問 Windows pc,而且我不想在沒有測(cè)試的情況下共享代碼,但我希望我向您指出了您應(yīng)該尋找的內(nèi)容。
添加回答
舉報(bào)