自用电脑温度报警

 

描述:

  最近发现电脑风扇有时候不转!散热口那会烫的厉害!拆开后盖后可能是风扇接线接触不良!写个程序监控一下CPU的温度!

1. windows控制台程序。 每2分钟采一次温度数据,如果温度高于60,70,80,90(不大可能)时分别响警报声2,4,6,8次;温度高于60,70时采集频率加倍,控制台打印字体显黄色;变成1分钟采一次,高于80的时候30秒采一次,控制台打印字体显示红色;

2. 加入windows自启动。

 自用电脑温度报警

代码:

  新建temptest.cpp。加入如下代码。

  报警声用cout<<"\a";也可以换成自己想要的铃声。

// temptest.cpp : 定义控制台应用程序的入口点。

//



#include "stdafx.h"

#define _WIN32_DCOM

#include <iostream>

using namespace std;

#include <comdef.h>

#include <Wbemidl.h>



# pragma comment(lib, "wbemuuid.lib")



int main(int argc, char **argv)

{

    int SLEEPTIME = 120;



    //设置控制台字体颜色

    HANDLE hOut;

    hOut = GetStdHandle(STD_OUTPUT_HANDLE);

    SetConsoleTextAttribute(hOut, FOREGROUND_GREEN|FOREGROUND_INTENSITY);



    CoInitializeEx(0,COINIT_MULTITHREADED);

    try 

    {

        if(SUCCEEDED(CoInitializeSecurity(NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL))) 

        {

            IWbemLocator *pLoc=NULL;

            if(SUCCEEDED(CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator,(LPVOID *)&pLoc)))

            {

                IWbemServices *pSvc=NULL;

                if(SUCCEEDED(pLoc->ConnectServer(_bstr_t(L"ROOT\\WMI"),NULL,NULL,0,NULL,0,0,&pSvc)))

                {

                    if(SUCCEEDED(CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE)))

                    {

                        while (true){



                            SLEEPTIME = 120;



                            SetConsoleTextAttribute(hOut, FOREGROUND_GREEN|FOREGROUND_INTENSITY);



                            IEnumWbemClassObject* pEnumerator=NULL;

                            if(SUCCEEDED(pSvc->ExecQuery(bstr_t("WQL"),bstr_t("SELECT * FROM MSAcpi_ThermalZoneTemperature"),WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumerator)))

                            {

                                IWbemClassObject *pclsObj;

                                ULONG uReturn=0;

                                while(pEnumerator)

                                {

                                    pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); 

                                    if(0==uReturn)

                                        break;

                                    VARIANT vtProp;

                                    VariantInit(&vtProp);

                                    pclsObj->Get(L"CurrentTemperature", 0, &vtProp, 0, 0);

                                    double CT = (vtProp.intVal - 2732)/10.0;



                                    int n = -1;

                                    switch(int(CT)/10)

                                    {

                                    case 9:n = 4;break;

                                    case 8:n = 3;break;

                                    case 7:n = 2;break;

                                    case 6:n = 1;break;

                                    default:n = 0;break;

                                    }

                                    for (int i = 0; i < 2*n; i++)

                                        cout<<"\a";

                    

                                    if (n == 2 || n == 1)

                                    {

                                        SetConsoleTextAttribute(hOut, FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY);

                                        SLEEPTIME = 60;

                                    }

                                    else if(n == 3 || n == 4)

                                    {

                                        SetConsoleTextAttribute(hOut, FOREGROUND_RED|FOREGROUND_INTENSITY);

                                        SLEEPTIME = 30;

                                    }

                                    cout << "Current CPU Temperature : " << (vtProp.intVal - 2732)/10.0 << endl;

                                    

                                    VariantClear(&vtProp);

                                    pclsObj->Release();

                                }

                            }

                        Sleep(SLEEPTIME*1000);

                        }

                    }

                    pSvc->Release();

                }

                pLoc->Release();

            }

        }

    }

    catch (_com_error err)

    {

    }

    CoUninitialize();

    return 0; 

}

 加入开机启动项,将程序拖到C:\Users\zhu\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup文件中,zhu换成自己的用户名

或写成bat放入。

@echo off
temptest.exe

 

你可能感兴趣的:(自用电脑温度报警)