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

C++ Builder 實戰:程式化控制 Windows 關機、重啟與登出

     編輯:VC 教學

應用場景:安裝程式的「最後一哩路」

開發安裝程式時,常需在安裝完成後自動重啟電腦以生效驅動或系統設置。Windows API 提供了 ExitWindowsEx 函數,讓開發者能以程式碼精確控制系統關機、重啟、登出甚至強制關機行為。本文將詳細說明該函數的參數含義,並提供一個完整的 C++ Builder 範例專案,展示如何在表單按鈕中集成這四種操作。

核心 API: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 已忽略此參數。

範例專案:一鍵控制系統電源狀態

專案建立步驟

  1. 啟動 C++ Builder,選 File → New → VCL Forms Application 建立新專案。
  2. 儲存單元為 PowerCtrlMain.cpp,專案儲存為 PowerCtrlDemo.cbproj。
  3. 在表單 (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);
    }
}

進階補充:權限與最佳實踐

1. 權限需求

  • 呼叫進程需擁有 SE_SHUTDOWN_NAME 特權(通常管理員預設擁有,普通使用者需透過群組策略授權)。
  • 若權限不足,函數回傳 FALSE,GetLastError() 為 ERROR_PRIVILEGE_NOT_HELD (1314)。

2. 現代替代方案:InitiateSystemShutdownEx

提供更豐富控制:自訂倒數計時、關機訊息、強制應用程式關閉、規劃重啟原因代碼等。適合企業級部署腳本。

3. 防誤觸設計建議

  • 關鍵操作(強制關機、重啟)務必加入二次確認對話框。
  • 安裝程式中應提供「稍後手動重啟」選項,尊重使用者自主權。
  • 記錄操作日誌(時間、操作類型、發起模組)便於事後稽核。

測試環境與驗證

本範例在 Windows 10/11 (x64)、C++ Builder 11 Alexandria 環境下編譯執行通過。早期版本 (Win98/BCB5) 亦相容,僅需注意 EWX_POWEROFF 常數定義差異。

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