開發一個常駐系統托盤的定時播放器,發現若程式未在關機前主動退出,會阻礙 Windows 關機或重啟。解決之道是在應用程式中攔截系統關機訊息,並回應允許關機。
Windows 執行關機時,會向所有執行中的應用程式發送 WM_QUERYENDSESSION (0x0011) 訊息。若應用程式回傳 1,系統即會繼續關機流程。因此,覆寫 WndProc 方法攔截該訊息並設定 m.Result = (IntPtr)1 即可實現自動退出。
/// <summary>
/// 系統關機時自動關閉應用程式
/// </summary>
/// <param name="m">系統訊息</param>
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x0011: // WM_QUERYENDSESSION
m.Result = (IntPtr)1; // 允許關機
break;
default:
base.WndProc(ref m);
break;
}
}
此做法無需額外呼叫 Application.Exit(),系統在收到允許回應後會自動發送 WM_ENDSESSION 並終止進程。適用於任何 WinForms 應用程式,確保不阻礙系統關機。