PDH (Performance Data Helper) 封裝了 Windows 性能注冊表數據庫,提供簡潔 API 讀取數百種系統計數器(CPU、內存、磁盤、網絡、進程等),支援實時查詢與日志文件回放。
PdhOpenQuery(NULL, 0, &hQuery)PdhAddCounter(hQuery, _T("\\Process(QQ)\\% Processor Time"), 0, &hCounter)PdhCollectQueryData(hQuery)(需兩次調用間隔計算速率)PdhGetFormattedCounterValue(hCounter, PDH_FMT_DOUBLE, &dwType, &fmtValue),fmtValue.doubleValue 即為當前 CPU%。PdhCloseQuery(hQuery)// 關鍵點:首次收集建立基線,Sleep 後再次收集才有速率值
PdhCollectQueryData(hQuery);
Sleep(1000);
PdhCollectQueryData(hQuery);
PdhGetFormattedCounterValue(hCounter, PDH_FMT_DOUBLE, &dwType, &fmtValue);
// fmtValue.doubleValue 即為實時 CPU%
\\Object(Instance)\\Counter 三部分組成:
Process, Processor, Memory, PhysicalDisk。QQ、磁盤 0 C: D:。無實例對象 (如 System) 省略括號。% Processor Time, Working Set, Disk Read Bytes/sec。例:\\Process(QQ)\\% Processor Time、\\System\\System Up Time。
避免硬編碼路徑,運行時發現可用指標:
PdhEnumObjects(NULL, NULL, szBuf, &dwSize, PERF_DETAIL_WIZARD, TRUE) 獲取所有對象名列表 (雙\0結尾)。PdhEnumObjectItems(NULL, NULL, objName, counterBuf, &cSize, instBuf, &iSize, PERF_DETAIL_WIZARD, 0) 獲取該對象下的所有計數器與實例名。調用 PdhGetCounterInfo(hCounter, TRUE, &dwSize, pInfo),結構 PDH_COUNTER_INFO 中 szExplainText 字段包含本地化說明(如「處理器執行非閒置線程的時間百分比」)。
Pdh.lib,包含 <Pdh.h>。_UNICODE, UNICODE),字符串用 _T() / TEXT() 宏。__try/__finally 為結構化異常處理 (SEH),非必需可改用 try/catch。