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。

QT获取CPU温度、使用率、风扇转速、功耗(无需WMI)

原文地址: http://www.cveoy.top/t/topic/fvSs 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录