在 Windows 平台开发性能监控类程序时,CPU 使用率是核心监控指标之一。本文基于 Windows 原生 PDH(Performance Data Helper)API,实现高精度、高兼容性的 CPU 使用率实时采集功能,代码可直接复用,适配 Win10/Win11 系统,与任务管理器 CPU 数值高度一致。
一、核心优势
- 原生 API:基于 Windows PDH 接口,无需第三方库,轻量化且稳定;
- 高精度:返回浮点型 CPU 使用率,支持自定义小数位数;
- 高兼容:适配 Win10/11,计数器路径经过实测验证,无数值偏差;
- 鲁棒性:包含完整的错误处理和异常值过滤,避免程序崩溃;
- 易复用:模块化设计,初始化、采集、释放功能分离,可直接集成到项目。
二、完整代码实现
#include <windows.h>
#include <pdh.h>
#include <iostream>
#include <cmath> // 用于 round() 四舍五入函数
// 链接 PDH 库,必须添加
#pragma comment(lib, "pdh.lib")
// 关闭安全警告
#pragma warning(disable:4996)
// CPU 监控句柄(全局/类成员均可,保证生命周期)
static PDH_HQUERY cpuQuery;
static PDH_HCOUNTER cpuTotal;
/**
* @brief 初始化 CPU 使用率采集模块
* @return bool 初始化成功返回 true,失败返回 false
* @note 必须先调用此函数,否则 getCPUUsage 返回 0
*/
bool initCPUMonitor() {
// 打开 PDH 查询句柄
if (PdhOpenQuery(NULL, NULL, &cpuQuery) != ERROR_SUCCESS) {
std::cerr << "CPU 监控初始化失败:打开查询句柄失败" << std::endl;
return false;
}
((cpuQuery, , , &cpuTotal) != ERROR_SUCCESS) {
std::cerr << << std::endl;
(cpuQuery);
;
}
(cpuQuery);
();
(cpuQuery);
;
}
{
PDH_FMT_COUNTERVALUE counterVal;
((cpuQuery) != ERROR_SUCCESS) {
;
}
DWORD ret = (cpuTotal, PDH_FMT_DOUBLE, , &counterVal);
(ret != ERROR_SUCCESS) {
;
}
cpuUsage = counterVal.doubleValue;
cpuUsage = (cpuUsage >= && cpuUsage <= ) ? cpuUsage : ;
(cpuUsage > ) cpuUsage = ;
cpuUsage = (cpuUsage * ) / ;
cpuUsage;
}
{
(cpuQuery != ) {
(cpuQuery);
cpuQuery = ;
}
}
{
(!()) {
;
}
std::cout << << std::endl;
() {
cpu = ();
std::cout << << cpu << << std::endl;
();
}
();
;
}

