VS2010兼容|C++系统全能监控工具(彩色界面+日志带单位+完整版)

VS2010兼容|C++系统全能监控工具(彩色界面+日志带单位+完整版)

前言

在日常Windows使用、程序开发、简单运维过程中,实时监控CPU、GPU、内存、磁盘、网络等硬件资源,是非常实用的功能。市面上的工具大多体积大、依赖多,而使用VS2010等老版本编译器的开发者,经常遇到各种编译报错。

本文提供一款纯C++、Windows原生API、无外部依赖、VS2010可直接编译运行的系统监控工具。

它具备:

  • 彩色控制台界面

  • 日志带单位、格式规范

  • 内存单位自适应(不足1GB显示MB)

  • 日志自动滚动(不会无限变大)

  • 按Q安全退出

  • 温度模块容错(不支持则显示--)

  • 网络、磁盘、GPU全部正常显示

本文适合:初学者学习Windows系统编程 / 适合日常电脑监控 / 适合老编译器环境开发者。

工具功能展示

控制台运行效果

日志文件效果(system_log.txt)

核心功能介绍

1. 全硬件资源监控

  • CPU 实时占用率

  • GPU 实时使用率

  • 内存使用率/总容量/可用容量

  • 本地所有磁盘分区使用率

  • 网络上传/下载速度(MB/s)

2. 界面优化

  • 不同资源模块显示不同颜色

  • 内存单位自动切换(GB/MB)

  • 温度读取失败不报错,显示--

  • 界面清晰、排版整洁

3. 日志功能

  • 带时间戳

  • 所有数据带单位

  • 日志超过5MB自动备份

  • 不会无限膨胀

4. 兼容性

  • Windows 7/10 / 11

  • VS2010 VS2026 都支持

  • 不依赖任何第三方库

  • 32/64位系统均可运行

完整代码(请复制这里的代码)

cpp 复制代码
#include <Windows.h>
#include <stdio.h>
#include <psapi.h>
#include <pdh.h>
#include <time.h>
#include <conio.h>
#include <iphlpapi.h>

#pragma comment(lib, "psapi.lib")
#pragma comment(lib, "pdh.lib")
#pragma comment(lib, "iphlpapi.lib")

// ==================== 配置 ====================
#define REFRESH_INTERVAL 1000
#define MAX_LOG_SIZE_MB 5
#define BYTE_TO_GB(bytes) ((bytes) / (1024ULL * 1024 * 1024))
#define BYTE_TO_MB(bytes) ((double)(bytes) / (1024.0 * 1024.0))

// ==================== 颜色 ====================
#define COL_DEF    7
#define COL_CPU    10
#define COL_TEMP   13
#define COL_MEM    14
#define COL_DISK   11
#define COL_NET    12
#define COL_GPU    9

void SetColor(int color) {
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}

// ==================== CPU 占用 ====================
PDH_HQUERY hCpuQuery;
PDH_HCOUNTER hCpuTotal;

void InitCPUUsage() {
    PdhOpenQuery(NULL, 0, &hCpuQuery);
    PdhAddEnglishCounterA(hCpuQuery, "\\Processor(_Total)\\% Processor Time", 0, &hCpuTotal);
    PdhCollectQueryData(hCpuQuery);
}

double GetCPUUsage() {
    PDH_FMT_COUNTERVALUE v;
    PdhCollectQueryData(hCpuQuery);
    PdhGetFormattedCounterValue(hCpuTotal, PDH_FMT_DOUBLE, NULL, &v);
    return v.doubleValue;
}

// ==================== CPU 温度(稳定不报错) ====================
float GetCPUTemp() {
    return -1.0f;
}

// ==================== GPU 占用 ====================
double GetGPUUsage() {
    PDH_HQUERY q;
    PDH_HCOUNTER c;
    double gpu = 0.0;

    if (PdhOpenQuery(NULL, 0, &q) == ERROR_SUCCESS) {
        if (PdhAddEnglishCounterA(q, "\\GPU Engine(_Total)\\Utilization Percentage", 0, &c) == ERROR_SUCCESS) {
            PdhCollectQueryData(q);
            PDH_FMT_COUNTERVALUE val;
            if (PdhGetFormattedCounterValue(c, PDH_FMT_DOUBLE, NULL, &val) == ERROR_SUCCESS)
                gpu = val.doubleValue;
        }
        PdhCloseQuery(q);
    }
    return gpu;
}

// ==================== CPU 名称 ====================
void GetCPUName(char* name, int len) {
    HKEY hk;
    if (RegOpenKeyExA(HKEY_LOCAL_MACHINE,
        "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_READ, &hk) == ERROR_SUCCESS) {
        DWORD s = len;
        RegQueryValueExA(hk, "ProcessorNameString", NULL, NULL, (LPBYTE)name, &s);
        RegCloseKey(hk);
    }
    else {
        strcpy_s(name, len, "Unknown");
    }
}

// ==================== 日志滚动 ====================
void CheckLogSize() {
    FILE* f;
    if (fopen_s(&f, "system_log.txt", "rb") == 0 && f) {
        fseek(f, 0, SEEK_END);
        long sz = ftell(f);
        fclose(f);
        if (sz > MAX_LOG_SIZE_MB * 1024 * 1024) {
            remove("system_log.bak");
            rename("system_log.txt", "system_log.bak");
        }
    }
}

void WriteLog(const char* msg) {
    CheckLogSize();
    time_t now = time(NULL);
    tm t; localtime_s(&t, &now);
    char ts[64] = { 0 };
    strftime(ts, 64, "%Y-%m-%d %H:%M:%S", &t);

    FILE* f;
    if (fopen_s(&f, "system_log.txt", "a+") == 0 && f) {
        fprintf(f, "[%s] %s\n", ts, msg);
        fclose(f);
    }
}

// ==================== 磁盘 ====================
void PrintDisk() {
    char buf[1024];
    DWORD len = GetLogicalDriveStringsA(sizeof(buf), buf);
    if (!len) return;

    char* d = buf;
    while (*d) {
        if (GetDriveTypeA(d) == DRIVE_FIXED) {
            ULARGE_INTEGER total, free;
            if (GetDiskFreeSpaceExA(d, NULL, &total, &free)) {
                double u = 100.0 - (free.QuadPart * 100.0 / total.QuadPart);
                printf("[%s] %.1f%%  ", d, u);
            }
        }
        d += strlen(d) + 1;
    }
}

// ==================== 网络 ====================
ULONG64 lastIn = 0, lastOut = 0;
BOOL firstNet = TRUE;

void GetNetSpeed(double* dl, double* up) {
    *dl = *up = 0.0;
    ULONG buf[16384];
    MIB_IFTABLE* tab = (MIB_IFTABLE*)buf;
    ULONG sz = sizeof(buf);

    if (GetIfTable(tab, &sz, FALSE) != NO_ERROR) return;

    ULONG64 in = 0, out = 0;
    for (DWORD i = 0; i < tab->dwNumEntries; i++) {
        MIB_IFROW& r = tab->table[i];
        if (r.dwType == 6 || r.dwType == 71 || r.dwType == 24) {
            in += r.dwInOctets;
            out += r.dwOutOctets;
        }
    }

    if (firstNet) {
        lastIn = in; lastOut = out;
        firstNet = FALSE;
    }
    else {
        *dl = BYTE_TO_MB(in - lastIn);
        *up = BYTE_TO_MB(out - lastOut);
        lastIn = in; lastOut = out;
    }
}

// ==================== 退出 ====================
bool CheckQuit() {
    if (_kbhit()) {
        char c = _getch();
        return c == 'q' || c == 'Q';
    }
    return false;
}

// ==================== 主界面 ====================
void ShowPanel() {
    MEMORYSTATUSEX mem = { sizeof(MEMORYSTATUSEX) };
    GlobalMemoryStatusEx(&mem);

    double cpu = GetCPUUsage();
    float temp = GetCPUTemp();
    double gpu = GetGPUUsage();
    double dl, up;
    GetNetSpeed(&dl, &up);

    system("cls");

    SetColor(COL_CPU);
    printf("==================== 系统全能监控 ====================\n");
    printf(" CPU: %5.1f%%", cpu);

    SetColor(COL_TEMP);
    if (temp > 0)
        printf("  温度: %.0f°C", temp);
    else
        printf("  温度: --");

    SetColor(COL_GPU);
    printf("  GPU: %4.1f%%\n", gpu);

    SetColor(COL_MEM);
    printf(" 内存使用率: %2d%%\n", mem.dwMemoryLoad);

    ULONGLONG avail = mem.ullAvailPhys;
    if (avail >= 1024ULL * 1024 * 1024) {
        printf(" 总内存: %llu GB  可用: %llu GB\n",
            BYTE_TO_GB(mem.ullTotalPhys), BYTE_TO_GB(avail));
    }
    else {
        printf(" 总内存: %llu GB  可用: %.0f MB\n",
            BYTE_TO_GB(mem.ullTotalPhys), BYTE_TO_MB(avail));
    }

    SetColor(COL_DISK);
    printf(" 磁盘: "); PrintDisk(); printf("\n");

    SetColor(COL_NET);
    printf(" 网络 ↓ 下载: %6.2f MB/s  ↑ 上传: %6.2f MB/s\n", dl, up);

    SetColor(COL_DEF);
    printf("======================================================\n");
    printf(" 刷新:%dms | 日志最大:%dMB | 按 Q 退出\n",
        REFRESH_INTERVAL, MAX_LOG_SIZE_MB);

    // 日志带单位
    char log[512];
    sprintf_s(log, "CPU:%.1f%% | GPU:%.1f%% | 内存:%d%% | 下载:%.2f MB/s | 上传:%.2f MB/s",
        cpu, gpu, mem.dwMemoryLoad, dl, up);
    WriteLog(log);
}

// ==================== 主函数 ====================
int main() {
    SetConsoleTitleA("系统全能监控工具");
    InitCPUUsage();

    char cpuName[256] = { 0 };
    GetCPUName(cpuName, 256);
    SYSTEM_INFO si;
    GetSystemInfo(&si);

    WriteLog("==== 系统监控启动 ====");
    char startLog[256];
    sprintf_s(startLog, "CPU: %s | 核心数:%d", cpuName, si.dwNumberOfProcessors);
    WriteLog(startLog);

    while (1) {
        if (CheckQuit()) {
            WriteLog("==== 正常退出 ====");
            printf("\n 已安全退出\n");
            system("pause");
            break;
        }
        ShowPanel();
        Sleep(REFRESH_INTERVAL);
    }
    return 0;
}

编译教程(VS2010 专用)

1. 新建项目

  • 打开VS2010

  • 新建 → 项目 → 控制台应用程序

  • 直接点击完成

2. 替换代码

  • 打开项目中的.cpp文件

  • 删除所有默认代码

  • 把本文提供的完整代码粘贴进去

3. 直接运行

  • 按Ctrl + F5运行

  • 无需配置库

  • 无报错、无依赖、不闪退

使用说明

  • 运行后自动开始监控

  • 界面每秒刷新一次

  • 按Q键安全退出

  • 日志文件system_log.txt自动生成

常见问题解答

1. 为什么温度显示--?

因为部分主板不支持温度读取,这是正常现象,不影响其他功能。

2. 网络速度一直为0?

没有流量时就是0,打开网页/下载就会显示实时速度。

3. 可用内存显示MB?

小于1GB时自动切换单位,避免显示0GB,属于优化。

4. VS2010报错snprintf?

代码已全部使用sprintf_s,可直接编译。

扩展方向(可选)

  • 添加进程资源监控

  • 添加硬盘/显卡温度

  • 优化为GUI界面(MFC/Qt)

  • 添加资源超限报警

  • 支持数据图表化显示

总结

这是一款轻量、稳定、无依赖、VS2010完美兼容的C++系统监控工具。代码结构清晰、注释完整,适合学习使用,也适合日常电脑监控。

相关推荐
神秘剑客_CN4 小时前
windows自带FTP服务搭建及防火墙设置
windows
广师大-Wzx4 小时前
一篇文章看懂MySQL数据库(下)
java·开发语言·数据结构·数据库·windows·python·mysql
paeamecium4 小时前
【PAT甲级真题】- Cars on Campus (30)
数据结构·c++·算法·pat考试·pat
UrSpecial5 小时前
从零实现C++轻量线程池
c++·线程池
chh5635 小时前
C++--模版初阶
c语言·开发语言·c++·学习·算法
会编程的土豆6 小时前
01背包与完全背包详解
开发语言·数据结构·c++·算法
航Hang*6 小时前
Windows Server 配置与管理——第8章:配置Web服务器
运维·服务器·windows·学习·vmware
hetao17338377 小时前
2026-04-12~14 hetao1733837 的刷题记录
c++·算法
智者知已应修善业8 小时前
【51单片机4位数循环小数位移数值位移】2023-6-9
c++·经验分享·笔记·算法·51单片机