在應用程式安裝完成或特定業務邏輯結束時,常需要程式化控制 Windows 關機、重啟或使用者登出。Windows API 提供 ExitWindowsEx 函數實現此功能,本文詳細說明其在 C++ Builder 中的使用方法。
BOOL ExitWindowsEx(
UINT uFlags, // 關機動作標誌
DWORD dwReserved // 保留參數,填 0 即可
);
| 旗標常數 | 功能描述 |
|---|---|
EWX_LOGOFF | 登出當前使用者,切換至登入畫面 |
EWX_SHUTDOWN | 正常關機 |
EWX_REBOOT | 重新啟動電腦 |
EWX_FORCE | 強制終止所有程式並關機(不提示儲存) |
EWX_FORCEIFHUNG | 僅在程式無響應時強制關閉(Windows 2000+ 支援) |
EWX_POWEROFF | 關機並切斷電源(需硬體支援) |
旗標可組合使用,例如 EWX_REBOOT | EWX_FORCE 表示強制重啟。
在表單上放置四個 TButton,Caption 分別設為:「其它身份登錄」、「關機」、「重新啟動」、「強制關機」。
void __fastcall TForm1::Button1Click(TObject *Sender) {
// 其它身份登錄
DWORD temp = 0;
ExitWindowsEx(EWX_LOGOFF, temp);
}
//------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender) {
// 關機
DWORD temp = 0;
ExitWindowsEx(EWX_SHUTDOWN, temp);
}
//------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender) {
// 重新啟動
DWORD temp = 0;
ExitWindowsEx(EWX_REBOOT, temp);
}
//------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender) {
// 強制關機
DWORD temp = 0;
ExitWindowsEx(EWX_FORCE, temp);
}
SE_SHUTDOWN_NAME 權限。在 Windows NT/2000/XP 及以上系統,若程式無管理員權限,呼叫可能失敗。可透過 AdjustTokenPrivileges 獲取權限。bool EnableShutdownPrivilege() {
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return false;
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
bool result = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, NULL);
CloseHandle(hToken);
return result;
}
在呼叫 ExitWindowsEx 前先呼叫此函數,可顯著提高在受限環境下的成功率。
掌握 ExitWindowsEx 及相關權限處理,讓 C++ Builder 開發者能靈活控制系統電源狀態,構建更完整的系統級應用程式。