開發系統級工具、診斷程式或資產管理客戶端時,準確獲取硬體與作業系統資訊是基礎需求。本文匯總 Windows API 獲取核心系統指標的標準方法與結構體定義。
讀取註冊表鍵值:
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\ProcessorNameString(字串)~\MHz(DWORD,主頻 MHz)使用 GetNativeSystemInfo 填充 SYSTEM_INFO 結構,關鍵欄位:
typedef struct _SYSTEM_INFO {
// ...
DWORD dwNumberOfProcessors; // 邏輯處理器數量
// ...
} SYSTEM_INFO;
調用 GetNativeSystemInfo(&si) 即可獲取,適用於 32/64 位元程式查詢 64 位元系統。
使用 GlobalMemoryStatusEx(建議優於舊版 GlobalMemoryStatus)填充 MEMORYSTATUSEX:
MEMORYSTATUSEX memInfo;
memInfo.dwLength = sizeof(memInfo);
GlobalMemoryStatusEx(&memInfo);
// 關鍵欄位(單位:Bytes)
memInfo.ullTotalPhys; // 物理記憶體總量
memInfo.ullAvailPhys; // 可用物理記憶體
memInfo.ullTotalVirtual; // 虛擬記憶體總量
memInfo.ullAvailVirtual; // 可用虛擬記憶體
memInfo.dwMemoryLoad; // 記憶體使用率百分比 (0-100)
使用 GetVersionEx 填充 OSVERSIONINFOEX(需設定 dwOSVersionInfoSize):
OSVERSIONINFOEX osvi = { sizeof(osvi) };
GetVersionEx((OSVERSIONINFO*)&osvi);
// 關鍵欄位
osvi.dwMajorVersion; // 主版本號 (10 = Win10/11)
osvi.dwMinorVersion; // 次版本號
osvi.dwBuildNumber; // 組建號
osvi.wProductType; // VER_NT_WORKSTATION / SERVER / DOMAIN_CONTROLLER
osvi.wSuiteMask; // 產品套件標識
osvi.szCSDVersion; // Service Pack 字串
注意: Windows 10/11 因版本號固定為 10.0,建議結合VerifyVersionInfo或RtlGetVersion(ntdll) 獲取真實建置版本。
GetTickCount64() 返回系統啟動以來的毫秒數(64 位元版本解決 49.7 天溢位問題)。轉換為天/時/分/秒即可顯示運行時長。
GetSystemDirectory → 通常為 C:\Windows\System32。GetSystemDefaultLangID() → 返回 LANGID(如 0x0804 = 簡體中文,0x0404 = 繁體中文)。文中附帶完整語言 ID 對照表(0x0401~0x0429),可直接用於多語言適配邏輯。
void PrintSystemInfo() {
// 1. CPU
SYSTEM_INFO si; GetNativeSystemInfo(&si);
// 讀註冊表獲取名稱/主頻...
// 2. 記憶體
MEMORYSTATUSEX ms; ms.dwLength = sizeof(ms); GlobalMemoryStatusEx(&ms);
// 3. OS 版本
OSVERSIONINFOEX osvi = { sizeof(osvi) }; GetVersionEx((OSVERSIONINFO*)&osvi);
// 4. 運行時間
ULONGLONG uptime = GetTickCount64();
// 5. 目錄與語言
TCHAR sysDir[MAX_PATH]; GetSystemDirectory(sysDir, MAX_PATH);
LANGID lang = GetSystemDefaultLangID();
// 格式化輸出...
}
掌握上述 API 與結構體,即可構建完整的系統資訊採集模組。注意 64 位元兼容性(優先使用 Ex 後綴版本)、權限需求(部分註冊表需管理員權限)及版本號獲取的新舊 API 差異。