ExitWindowsEx僅兩個參數:
uFlags:動作旗標組合
EWX_SHUTDOWN 關機EWX_REBOOT 重啟EWX_LOGOFF 登出EWX_FORCE 強制(不發送 WM_QUERYENDSESSION,直接終止程序,可能造成資料遺失)dwReserved:保留,傳 0。呼叫 ExitWindowsEx 執行關機/重啟前,進程必須擁有 SE_SHUTDOWN_NAME 特權,否則失敗。完整啟用流程:
BOOL EnableShutdownPrivilege() {
HANDLE hProcess = GetCurrentProcess(), hToken;
LUID luid; TOKEN_PRIVILEGES tp = {0};
if (!OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken)) return FALSE;
if (!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luid)) return FALSE;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL)) return FALSE;
if (GetLastError() != ERROR_SUCCESS) return FALSE;
CloseHandle(hToken);
return TRUE;
}
BOOL Shutdown(BOOL bForce) {
EnableShutdownPrivilege();
return ExitWindowsEx(EWX_SHUTDOWN | (bForce ? EWX_FORCE : 0), 0);
}
BOOL Reboot(BOOL bForce) {
EnableShutdownPrivilege();
return ExitWindowsEx(EWX_REBOOT | (bForce ? EWX_FORCE : 0), 0);
}
BOOL Logoff(BOOL bForce) {
// 登出不需關機特權
return ExitWindowsEx(EWX_LOGOFF | (bForce ? EWX_FORCE : 0), 0);
}
int main() {
Logoff(FALSE); Reboot(FALSE); Shutdown(FALSE);
Logoff(TRUE); Reboot(TRUE); Shutdown(TRUE);
return 0;
}
EWX_FORCE 會繞過程序詢問,直接強制終止,**謹慎使用**,可能導致未儲存資料遺失。requireAdministrator。