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

Windows 系統資訊獲取全攻略:CPU、記憶體、作業系統版本與運行時間

     編輯:關於C語言

前言

開發系統級工具、診斷程式或資產管理客戶端時,準確獲取硬體與作業系統資訊是基礎需求。本文匯總 Windows API 獲取核心系統指標的標準方法與結構體定義。

1. CPU 資訊

處理器名稱與主頻

讀取註冊表鍵值:

  • 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 位元系統。

2. 記憶體資訊

使用 GlobalMemoryStatusEx(建議優於舊版 GlobalMemoryStatus)填充 MEMORYSTATUSEX:

MEMORYSTATUSEX memInfo;
memInfo.dwLength = sizeof(memInfo);
GlobalMemoryStatusEx(&memInfo);

// 關鍵欄位(單位:Bytes)
memInfo.ullTotalPhys;      // 物理記憶體總量
memInfo.ullAvailPhys;      // 可用物理記憶體
memInfo.ullTotalVirtual;   // 虛擬記憶體總量
memInfo.ullAvailVirtual;   // 可用虛擬記憶體
memInfo.dwMemoryLoad;      // 記憶體使用率百分比 (0-100)

3. 作業系統版本資訊

使用 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) 獲取真實建置版本。

4. 系統運行時間

GetTickCount64() 返回系統啟動以來的毫秒數(64 位元版本解決 49.7 天溢位問題)。轉換為天/時/分/秒即可顯示運行時長。

5. 系統目錄與語言環境

  • 系統目錄:GetSystemDirectory → 通常為 C:\Windows\System32。
  • 系統預設語言 ID: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 差異。

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