windows平台下获取电脑温度数据

项目描述:
想开发一个在windows平台下可以显示电脑温度的软件

注意: 软件需要在管理员模式下运行。
简单的实现:

  1. 使用系统命令
    QProcess process;
    process.start("wmic /namespace:\\\\root\\wmi PATH MSAcpi_ThermalZoneTemperature get CurrentTemperature");
    process.waitForFinished();
    QString result = process.readAllStandardOutput();
    qDebug() << result;
结果:
"CurrentTemperature  \r\r\n3282                \r\r\n\r\r\n"
温度 = (结果- 2732) / 10
  1. 使用windows接口函数

#include <windows.h>
#include <comdef.h>
#include <Wbemidl.h>
#include <QDebug>
#pragma comment(lib, "wbemuuid.lib")
int main(int argc, char *argv[]) {
    
    
    CoInitializeEx(NULL, COINIT_MULTITHREADED);
    HRESULT hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
    if (FAILED(hr))    {
    
    
        qDebug() << "CoInitializeSecurity failed";
        return -1;
    }
    IWbemLocator *pLoc = NULL;
    hr = CoCreateInstance(        CLSID_WbemLocator,         0,         CLSCTX_INPROC_SERVER,         IID_IWbemLocator,         (LPVOID *)&pLoc    );
    if (FAILED(hr))    {
    
    
        qDebug() << "CoCreateInstance failed";
        CoUninitialize();
        return -1;
    }
    IWbemServices *pSvc = NULL;
    hr = pLoc->ConnectServer(bstr_t(L"ROOT\\WMI"), NULL, NULL, 0, NULL, 0, 0, &pSvc);
    if (FAILED(hr))    {
    
    
        qDebug() << "ConnectServer failed";
        pLoc->Release();
        CoUninitialize();
        return -1;
    }
    hr = 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(hr))    {
    
    
        qDebug() << "CoSetProxyBlanket failed";
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return -1;
    }
    IEnumWbemClassObject *pEnumerator = NULL;
    hr = pSvc->ExecQuery(_bstr_t(L"WQL"), _bstr_t(L"SELECT * FROM MSAcpi_ThermalZoneTemperature"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
    if (FAILED(hr))    {
    
    
        qDebug() << "ExecQuery failed";
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return -1;
    }
    IWbemClassObject *pclsObj = NULL;
    ULONG uReturn = 0;
    while (pEnumerator)    {
    
    
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
        if (0 == uReturn)        {
    
    
            break;
        }
        VARIANT vtProp;
        hr = pclsObj->Get(L"CurrentTemperature", 0, &vtProp, 0, 0);
        double temperature = ((double)vtProp.llVal - 2732) / 10;
        qDebug() << "Temperature: " << temperature;
        VariantClear(&vtProp);
        pclsObj->Release();
    }
    pEnumerator->Release();
    pSvc->Release();
    pLoc->Release();
    CoUninitialize();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44248637/article/details/130578804