最近需要编写一个电脑硬件监控软件,能够实时获取计算机的 CPU 利用率、内存占用率、显卡利用率、CPU 温度、显卡温度、硬盘温度、主板温度、硬盘利用率、CPU 频率、风扇转速、总网速、实时上传速率、实时下载速率等一系列监控指标。要实现该功能,我们可以借助 LibreHardwareMonitor 这个第三方库。
1. 下载 LibreHardwareMonitor
(1)LibreHardwareMonitor 是一个强大的开源硬件监控库,能够读取 CPU、内存、硬盘、风扇、温度等硬件信息。访问其官方 GitHub 仓库下载最新的发布版本:https://github.com/LibreHardwareMonitor/LibreHardwareMonitor
(2)将下载下来的压缩包解压后,里面的 LibreHardwareMonitorLib.dll 就是我们后面需要用到的 dll 文件。
(3)压缩包里有一个官方提供的监控工具软件,运行 LibreHardwareMonitor.exe 可以看到其能够获取到的各种监测数据。
2. 创建项目
(1)使用'以管理员身份运行'方式打开 Visual Studio。如果没有管理员权限,程序运行调试时温度监控、显卡利用率、硬盘利用率、风扇转速等硬件监控信息会获取不到。
(2)为方便演示,创建一个'控制台应用'。
(3)项目创建完毕后,把前面下载下来的 LibreHardwareMonitorLib.dll 放到刚创建的项目文件夹中。
(4)在项目上右键点击选择'属性',接着在弹出的属性页中将配置切换成'所有配置',点击'高级',将公共语言运行时支持改成'.NET Framework 运行时支持(/clr)'。
(5)切换到'生成后事件',在命令行一栏填写如下内容,然后应用。这个配置是为了让 LibreHardwareMonitorLib.dll 文件能自动复制到生成的.exe 所在的文件夹里,避免手动复制。
Copy /Y "$(SolutionDir)*.dll" "$(TargetDir)"
3. 编写代码
我们将项目默认生成的 cpp 文件内容修改成如下代码。该代码通过调用 LibreHardwareMonitorLib.dll 实现对计算机硬件信息(如 CPU、GPU、内存等)的实时监控和递归遍历输出,每隔 5 秒更新一次。
#include <iostream>
#include <thread>
#include <chrono>
#include <msclr\marshal_cppstd.h>
#include <msclr\interop.h>
using namespace System;
using namespace LibreHardwareMonitor::Hardware;
// 函数:GetHardwareInfo
// 描述:递归地获取硬件信息并打印到控制台
// 参数:IHardware^ hardware - 当前硬件对象
int GetHardwareInfo {
{
hardware->();
(hardware->HardwareType) {
HardwareType::Cpu: {
std::cout << << std::endl;
{
std::string name = msclr::interop::<std::string>(sensor->Name);
value = sensor->Value.HasValue ? sensor->Value.Value : ;
(value != ) {
std::cout << << name << << value << std::endl;
}
}
;
}
HardwareType::GpuIntel:
HardwareType::GpuNvidia:
HardwareType::GpuAmd: {
std::cout << << std::endl;
{
std::string name = msclr::interop::<std::string>(sensor->Name);
value = sensor->Value.HasValue ? sensor->Value.Value : ;
(value != ) {
std::cout << << name << << value << std::endl;
}
}
;
}
HardwareType::Memory: {
std::cout << << std::endl;
{
std::string name = msclr::interop::<std::string>(sensor->Name);
value = sensor->Value.HasValue ? sensor->Value.Value : ;
(value != ) {
std::cout << << name << << value << std::endl;
}
}
;
}
HardwareType::Motherboard: {
std::cout << << std::endl;
{
std::string name = msclr::interop::<std::string>(sensor->Name);
value = sensor->Value.HasValue ? sensor->Value.Value : ;
(value != ) {
std::cout << << name << << value << std::endl;
}
}
;
}
HardwareType::Storage: {
std::cout << << std::endl;
{
std::string name = msclr::interop::<std::string>(sensor->Name);
value = sensor->Value.HasValue ? sensor->Value.Value : ;
(value != ) {
std::cout << << name << << value << std::endl;
}
}
;
}
HardwareType::Network: {
std::cout << << std::endl;
{
std::string name = msclr::interop::<std::string>(sensor->Name);
value = sensor->Value.HasValue ? sensor->Value.Value : ;
(value != ) {
std::cout << << name << << value << std::endl;
}
}
;
}
HardwareType::SuperIO: {
std::cout << << std::endl;
{
std::string name = msclr::interop::<std::string>(sensor->Name);
value = sensor->Value.HasValue ? sensor->Value.Value : ;
(value != ) {
std::cout << << name << << value << std::endl;
}
}
;
}
:
std::cout << << std::endl;
;
}
( i = ; i < hardware->SubHardware->Length; i++) {
(hardware->SubHardware[i]);
}
}
(Exception^ ex) {
std::cerr << << msclr::interop::<std::string>(ex->Message) << std::endl;
;
}
;
}
{
Computer^ computer = gcnew ();
computer->IsCpuEnabled = ;
computer->IsGpuEnabled = ;
computer->IsMemoryEnabled = ;
computer->IsMotherboardEnabled = ;
computer->IsStorageEnabled = ;
computer->IsNetworkEnabled = ;
computer->IsBatteryEnabled = ;
computer->();
() {
( i = ; i < computer->Hardware->Count; i++) {
IHardware^ hardware = computer->Hardware[i];
(hardware);
}
std::this_thread::(std::chrono::());
}
computer->();
;
}

