首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ Builder 控制 Windows 關機、重啟、登出與強制關機實作

     編輯:關於C++

在應用程式安裝完成或特定業務邏輯結束時,常需要程式化控制 Windows 關機、重啟或使用者登出。Windows API 提供 ExitWindowsEx 函數實現此功能,本文詳細說明其在 C++ Builder 中的使用方法。

ExitWindowsEx 函數原型

BOOL ExitWindowsEx(
    UINT uFlags,      // 關機動作標誌
    DWORD dwReserved  // 保留參數,填 0 即可
);

主要 uFlags 參數值與含義

旗標常數功能描述
EWX_LOGOFF登出當前使用者,切換至登入畫面
EWX_SHUTDOWN正常關機
EWX_REBOOT重新啟動電腦
EWX_FORCE強制終止所有程式並關機(不提示儲存)
EWX_FORCEIFHUNG僅在程式無響應時強制關閉(Windows 2000+ 支援)
EWX_POWEROFF關機並切斷電源(需硬體支援)

旗標可組合使用,例如 EWX_REBOOT | EWX_FORCE 表示強制重啟。

C++ Builder 完整實作範例

介面設計

在表單上放置四個 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 獲取權限。
  • 應用場景:安裝程式完成需重啟、定時關機工具、遠端管理軟體、系統維護腳本。
  • 使用者體驗:執行關機操作前,建議彈出確認對話框,避免誤觸導致資料遺失。
  • 測試環境:本範例在中文 Windows 98 + C++ Builder 5.0 下測試通過;現代 Windows 版本同樣適用,但需注意 UAC 與權限機制。

擴展:獲取關機權限的輔助函數

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 開發者能靈活控制系統電源狀態,構建更完整的系統級應用程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved