QT获取CPU温度、使用率、风扇转速、功耗(无需WMI)
QT获取CPU温度、使用率、风扇转速、功耗(无需WMI)
在Windows平台下,想要获取CPU温度、CPU使用率、CPU风扇转速以及CPU功耗,除了使用WMI,还可以借助第三方库,例如OpenHardwareMonitor。
代码示例(使用OpenHardwareMonitor):
#include <iostream>
#include <Windows.h>
#include <comdef.h>
#include <wbemidl.h>
#pragma comment(lib, 'wbemuuid.lib')
int main()
{
HRESULT hres;
// 初始化COM
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
std::cout << 'Failed to initialize COM library. Error code: ' << hres << std::endl;
return 1;
}
// 创建WMI服务
IWbemLocator* pLoc = NULL;
hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);
if (FAILED(hres))
{
std::cout << 'Failed to create IWbemLocator object. Error code: ' << hres << std::endl;
CoUninitialize();
return 1;
}
IWbemServices* pSvc = NULL;
hres = pLoc->ConnectServer(_bstr_t(L'ROOT\\OpenHardwareMonitor'), NULL, NULL, 0, NULL, 0, 0, &pSvc);
if (FAILED(hres))
{
std::cout << 'Failed to connect to WMI namespace. Error code: ' << hres << std::endl;
pLoc->Release();
CoUninitialize();
return 1;
}
// 设置安全级别
hres = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
if (FAILED(hres))
{
std::cout << 'Failed to set security level. Error code: ' << hres << std::endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1;
}
// 查询CPU信息
IEnumWbemClassObject* pEnumerator = NULL;
hres = pSvc->ExecQuery(_bstr_t('WQL'), _bstr_t('SELECT * FROM Sensor WHERE SensorType='Temperature' OR SensorType='Load' OR SensorType='Fan' OR SensorType='Power''), WBEM_FLAG_FORWARD_ONLY, NULL, &pEnumerator);
if (FAILED(hres))
{
std::cout << 'Failed to execute WQL query. Error code: ' << hres << std::endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1;
}
// 遍历查询结果
IWbemClassObject* pclsObj = NULL;
ULONG uReturn = 0;
while (pEnumerator)
{
hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (uReturn == 0)
{
break;
}
VARIANT vtProp;
hres = pclsObj->Get(L'Name', 0, &vtProp, 0, 0);
if (SUCCEEDED(hres))
{
std::wstring name(vtProp.bstrVal, SysStringLen(vtProp.bstrVal));
VariantClear(&vtProp);
hres = pclsObj->Get(L'Value', 0, &vtProp, 0, 0);
if (SUCCEEDED(hres))
{
if (name.find(L'Temperature') != std::wstring::npos)
{
std::cout << 'CPU Temperature: ' << vtProp.fltVal << ' °C' << std::endl;
}
else if (name.find(L'Load') != std::wstring::npos)
{
std::cout << 'CPU Load: ' << vtProp.fltVal << ' %' << std::endl;
}
else if (name.find(L'Fan') != std::wstring::npos)
{
std::cout << 'CPU Fan Speed: ' << vtProp.fltVal << ' RPM' << std::endl;
}
else if (name.find(L'Power') != std::wstring::npos)
{
std::cout << 'CPU Power: ' << vtProp.fltVal << ' W' << std::endl;
}
VariantClear(&vtProp);
}
}
pclsObj->Release();
}
// 释放COM对象
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 0;
}
注意: 上述代码使用了WMI (Windows Management Instrumentation), 但你可以根据需要替换成其他库或API。
原文地址: http://www.cveoy.top/t/topic/fvSs 著作权归作者所有。请勿转载和采集!