發表文章

目前顯示的是 4月, 2014的文章

如何防止 Windows 重新啟動或關機

一般 MFC Dialog base 的程式,我們會在 OnInitDialog() 做一些初始化的動作;然後在 PostNcDestroy() 做一些清除資源,或將資料寫回 HD 的動作。 但在 Windows 重新啟動或關機的情況下,是不會執行到 PostNcDestroy() 的,這時就會造成一些程式動作未完成。 Windows 有兩個 Message 跟重新啟動或關機有關: WM_QUERYENDSESSION  :詢問程式是否可關機,回傳 TRUE 表示可以,FALSE 則不行。此外 lParam 會指出一些程式關閉的情況,不過在 MFC OnQueryEndSession() 都省略掉了。 WM_ENDSESSION :程式執行完 WM_QUERYENDSESSION 後呼叫 (不論其傳回結果為 TRUE 或 FASE),其傳回結果會反應在 wParam;而 lParam 的內容同 WM_QUERYENDSESSION,不過在 MFC OnEndSession() 一樣被省略了。 所以這兩個地方都可以拿來做跟 PostNcDestroy() 一樣的工作,差別在 WM_QUERYENDSESSION 可以傳回 FALSE 來阻止 Windows 重新啟動或關機而己。