需要在自有程式內嵌即時 CPU/記憶體監控圖表?本文提供兩個獨立 MFC 控件類 CCpuUsgesCtl、CMemUsgesCtl,封裝資料採集、定時器驅動、雙緩衝繪圖,支援動態建立或對話框資源綁定兩種用法,VC6/XP 驗證通過。
ntdll.dll 非公開 API NtQuerySystemInformation,讀取 SystemPerformanceInformation 中的 IdleTime 與 SystemTime 差值計算。CPU% = 100 - (IdleDelta / SystemDelta) * 100 / ProcessorCountHKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\VMM 下的計數器估算。
// NT 核心關鍵片段
typedef LONG (WINAPI *PFN_NtQuerySystemInformation)(UINT, PVOID, ULONG, PULONG);
PFN_NtQuerySystemInformation NtQSI = (PFN_NtQuerySystemInformation)
GetProcAddress(GetModuleHandle("ntdll"), "NtQuerySystemInformation");
// 取得處理器數、系統時間、閒置時間... 計算百分比
m_fNewUsges = (UINT)cpuPercent;
統一呼叫 GlobalMemoryStatus:
MEMORYSTATUS ms = {sizeof(ms)};
GlobalMemoryStatus(&ms);
m_ulNewUsges = ms.dwMemoryLoad; // 0-100 整數百分比
CWnd,內含 CBitmap 雙緩衝,OnTimer 週期採集 + Invalidate 觸發重繪,OnPaint 直接 BitBlt 記憶體位圖 → **零閃爍**。
CCpuUsgesCtl m_cpuCtrl;
CMemUsgesCtl m_memCtrl;
int CMyDlg::OnCreate(LPCREATESTRUCT lpCS) {
CRect rect(10,10,200,100);
if (!m_cpuCtrl.Create(WS_CHILD|WS_VISIBLE, rect, this, IDC_CPUCTL)) return -1;
rect.OffsetRect(0, 110);
if (!m_memCtrl.Create(WS_CHILD|WS_VISIBLE, rect, this, IDC_MEMCTL)) return -1;
return 0;
}
IDC_CPU_STATIC)。m_cpuCtrl,類型改為 CCpuUsgesCtl。
原始碼含兩個控件類完整實作與測試對話框專案,VC6/XP 編譯通過,附件下載。