開發安裝程式時,常需在安裝完成後自動重啟電腦以生效驅動或系統設置。Windows API 提供了 ExitWindowsEx 函數,讓開發者能以程式碼精確控制系統關機、重啟、登出甚至強制關機行為。本文將詳細說明該函數的參數含義,並提供一個完整的 C++ Builder 範例專案,展示如何在表單按鈕中集成這四種操作。
ExitWindowsEx 詳解BOOL ExitWindowsEx(
UINT uFlags, // 關機操作類型標誌
DWORD dwReserved // 保留參數,必須為 0
);
uFlags 主要取值對照表:
| 常數值 | 行為描述 |
|---|---|
EWX_LOGOFF (0x00) | 登出當前使用者,返回登入畫面 |
EWX_SHUTDOWN (0x01) | 關機並切斷電源(ATX 電源) |
EWX_REBOOT (0x02) | 關機後自動重新啟動 |
EWX_FORCE (0x04) | 強制終止所有進程不等待存檔確認(慎用) |
EWX_POWEROFF (0x08) | 關機並切斷電源(同 SHUTDOWN,新版本建議) |
註:dwReserved 在舊版 SDK 中需傳 0,新版 Windows 已忽略此參數。
PowerCtrlMain.cpp,專案儲存為 PowerCtrlDemo.cbproj。TForm1) 放置四個 TButton,依序設定 Caption 為:「登出」、「關機」、「重啟」、「強制關機」。// 登出當前使用者
void __fastcall TForm1::btnLogoffClick(TObject *Sender) {
ExitWindowsEx(EWX_LOGOFF, 0);
}
// 正常關機
void __fastcall TForm1::btnShutdownClick(TObject *Sender) {
ExitWindowsEx(EWX_SHUTDOWN | EWX_POWEROFF, 0);
}
// 重新啟動
void __fastcall TForm1::btnRebootClick(TObject *Sender) {
ExitWindowsEx(EWX_REBOOT, 0);
}
// 強制關機(不提示存檔,資料可能遺失!)
void __fastcall TForm1::btnForceClick(TObject *Sender) {
if (MessageBox(Handle, L"確定要強制關機?未儲存資料將遺失!", L"警告", MB_ICONWARNING | MB_YESNO) == ID_YES) {
ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE | EWX_POWEROFF, 0);
}
}
SE_SHUTDOWN_NAME 特權(通常管理員預設擁有,普通使用者需透過群組策略授權)。FALSE,GetLastError() 為 ERROR_PRIVILEGE_NOT_HELD (1314)。InitiateSystemShutdownEx提供更豐富控制:自訂倒數計時、關機訊息、強制應用程式關閉、規劃重啟原因代碼等。適合企業級部署腳本。
本範例在 Windows 10/11 (x64)、C++ Builder 11 Alexandria 環境下編譯執行通過。早期版本 (Win98/BCB5) 亦相容,僅需注意 EWX_POWEROFF 常數定義差異。