《系統飛狐》是一套系統優化工具,其核心模組「系統監視器」能以即時曲線呈現 CPU 使用率、核心執行緒數、磁碟快取、記憶體用量等關鍵指標。本文深入解析其在 VC++ 6.0 下、針對 Windows 9x 平台的實作原理與核心程式碼。

圖 1:系統監視器主介面
Windows 9x 將即時效能計數器暴露於動態註冊表鍵值 HKEY_DYN_DATA\PerfStats 下。主要包含兩個子鍵:
StartStat:計數器初始值(系統啟動時快照)。StatData:即時計數器當前值。透過 RegOpenKeyEx()、RegQueryValueEx() 讀取這些值,並計算差值,即可獲得各項指標的瞬間變化量。
HKEY hkey;
DWORD dwDataSize = sizeof(DWORD), dwType, dwCpuUsage, dwThreadUsage;
// 1. 讀取初始值
RegOpenKeyEx(HKEY_DYN_DATA, "PerfStats\\StartStat", 0, KEY_ALL_ACCESS, &hkey);
RegQueryValueEx(hkey, "KERNEL\\CPUUsage", NULL, &dwType, (LPBYTE)&dwCpuUsage, &dwDataSize);
RegQueryValueEx(hkey, "KERNEL\\Threads", NULL, &dwType, (LPBYTE)&dwThreadUsage, &dwDataSize);
RegCloseKey(hkey);
// 2. 定時器週期性讀取即時值並計算差值
SetTimer(1, 500, NULL); // 500ms 週期
void CCpuPage::OnTimer(UINT nIDEvent) {
RegOpenKeyEx(HKEY_DYN_DATA, "PerfStats\\StatData", 0, KEY_READ, &hkey);
RegQueryValueEx(hkey, "KERNEL\\CPUUsage", NULL, &dwType, (LPBYTE)&dwCpuUsage, &dwDataSize);
RegQueryValueEx(hkey, "KERNEL\\Threads", NULL, &dwType, (LPBYTE)&dwThreadUsage, &dwDataSize);
RegCloseKey(hkey);
// 計算差值、更新 UI...
Invalidate(FALSE); // 觸發重繪
CPropertyPage::OnTimer(nIDEvent);
}
使用移位陣列保存歷史數值,搭配 CPaintDC 繪製折線圖:
void CCpuPage::OnPaint() {
CPaintDC dc(this);
CRect rt; GetClientRect(&rt);
// 歷史資料左移
for (int i = 0; i < 49; i++) m_CPUData[i] = m_CPUData[i+1];
m_CPUData[49] = n * 3; // 縮放適應座標
// 繪製折線
dc.MoveTo(146, 94 - m_CPUData[0]);
for (int i = 1; i < 50; i++) {
dc.LineTo(146 + 4.7 * i, 94 - m_CPUData[i] / 1.2);
}
}

圖 2:CPU 使用率即時曲線
| 指標 | 註冊表路徑 |
|---|---|
| CPU 使用率 | KERNEL\CPUUsage |
| 核心執行緒數 | KERNEL\Threads |
| 磁碟快取命中率 | KERNEL\DiskCache |
| 可用記憶體 | KERNEL\FreeMemory |
| 分頁檔使用量 | KERNEL\PageFile |
HKEY_DYN_DATA 為 9x 專有)。系統監視器展示了如何利用 Windows 9x 註冊表動態效能資料,配合 MFC 定時器與 GDI 繪圖,構建輕量級即時監控工具。完整原始碼已開源,歡迎改良移植至新版 Windows 平台。