Windows 9x/2000/XP 支援多種啟動模式:正常模式、安全模式、帶網路安全模式。某些應用程式(多媒體、網路服務)在安全模式下功能受限,需於啟動時偵測並提示使用者或調整行為。C++Builder 可透過 Windows API GetSystemMetrics(SM_CLEANBOOT) 輕鬆實現。
int GetSystemMetrics(int nIndex);
// nIndex = SM_CLEANBOOT (0x0067) 專門用於偵測啟動模式
| 返回值 | 啟動模式 | 特徵 |
|---|---|---|
| 0 | 正常模式 | 完整驅動程式與服務載入 |
| 1 | 安全模式 | 最小驅動集合,無網路、無多媒體 |
| 2 | 帶網路安全模式 | 安全模式 + 網路驅動 |
#include
#pragma hdrstop
#include // GetSystemMetrics 宣告
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int mode = GetSystemMetrics(SM_CLEANBOOT);
switch (mode) {
case 0:
ShowMessage("正常模式啟動 - 所有功能可用");
break;
case 1:
ShowMessage("安全模式啟動 - 多媒體/網路功能受限");
// 可選:停用相關功能按鈕、記錄日誌、引導使用者重啟
break;
case 2:
ShowMessage("帶網路安全模式啟動 - 基本網路可用,多媒體受限");
break;
default:
ShowMessage("未知啟動模式,系統可能異常");
break;
}
}
// 專案原始碼 (.cpp) 或主表單 OnCreate
int bootMode = GetSystemMetrics(SM_CLEANBOOT);
if (bootMode != 0) {
// 安全模式下的應對策略
Application->MessageBox(
"偵測到安全模式啟動。\n部分功能(影音播放/網路同步)將不可用。\n建議重新啟動進入正常模式。",
"啟動模式提醒", MB_OK | MB_ICONWARNING
);
// 範例:停用需多媒體/網路的功能選單
MenuItemMultimedia->Enabled = false;
MenuItemNetworkSync->Enabled = false;
// 記錄啟動模式供診斷
LogEvent(Format("Boot mode: %d (0=Normal,1=Safe,2=Safe+Net)", bootMode));
}
SM_CLEANBOOT 行為一致。Win32_ComputerSystem.BootupState ("Normal boot"/"Safe boot"),但需 COM 初始化,較重量級。單一 API 呼叫 GetSystemMetrics(SM_CLEANBOOT) 即可可靠偵測 Windows 啟動模式。在應用程式啟動早期(WinMain、專案原始碼或主表單 OnCreate)執行偵測,依模式調整功能可用性、提示使用者或記錄診斷資訊,能顯著提升軟體在受限環境下的健壯度與使用者體驗。