项目描述:
想开发一个在windows平台下可以显示电脑温度的软件
注意: 软件需要在管理员模式下运行。
简单的实现:
- 使用系统命令
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
- 使用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;
}