请问如何通过delphi获得CPU当前温度?

解决方案 »

  1.   

    先要主板支持吧,然后读BIOS,温度是实时变化的。
    我不会,帮你顶一下子:)
      

  2.   

    下面这段代码可以试试!
     type
        TBus           = (ISA, SMBus, VIA686ABus, DirectIO);
        TSMB           = (SMBIntel, SMBAMD, SMBALi);
      type
        TSharedData = Record
          STemperature       : array [1..10]  of Integer;  
          SVoltage           : array [1..10]  of Real;     
          SFan               : array [1..10]  of Integer;   
          SMHZ               : Integer;                     
          SNrCPU             : Byte;                        
          SCPUUsage          : array [1..4]     of Real;    
        end;
        TSharedInfo = Record
          SMBM_Version       : array [0..10]  of Char;      
          SSMB_Base          : Word;                        
          SSMB_Type          : TBus;                        
          SSMB_Code          : TSMB;                        
          SSMB_Addr          : Byte;                        
          SSMB_Name          : array [0..40]  of Char;      
          SISA_Base          : Word;                        
          SChipType          : Integer;                     
          SVoltageSubType    : Byte;                        
        end;
        TSharedHL = Record                                  
          STempC             : array [1..10]  of LongInt;   
          STempA             : array [1..10]  of Extended;  
          STempL             : array [1..10]  of Real;      
          STempH             : array [1..10]  of Real;      
          SVoltC             : array [1..10]  of LongInt;   
          SVoltA             : array [1..10]  of Extended;  
          SVoltL             : array [1..10]  of Real;      
          SVoltH             : array [1..10]  of Real;      
          SFanC              : array [1..10]  of LongInt;   
          SFanA              : array [1..10]  of Extended;  
          SFanL              : array [1..10]  of Real;      
          SFanH              : array [1..10]  of Real;      
          SStart             : array [0..40]  of Char;      
          SCurrent           : array [0..40]  of Char;      
          SCPUC              : array [1..4]   of LongInt;   
          SCPUA              : array [1..4]   of Extended;  
          SCPUL              : array [1..4]   of Real;      
          SCPUH              : array [1..4]   of Real;      
        end;
        TSharedName = Record
          STempName       : array [1..10] of array [0..10] of Char;  
          SVoltName       : array [1..10] of array [0..10] of Char;  
          SFanName        : array [1..10] of array [0..10] of Char;  
          SCPUName        : array [0..10] of Char;                   
          SCPUUSageName   : array [0..10] of Char;                    
        end;
      PSharedData = ^TSharedData;
      PSharedInfo = ^TSharedInfo;
      PSharedHL   = ^TSharedHL;
      PSharedName = ^TSharedName;
    var
      CPUMhz            : Integer;
      CPUNr             : Byte;
      Temperature       : array [1..10]  of Integer
      Voltage           : array [1..10]  of Real;
      Fan               : array [1..10]  of Integer;
      CPU               : array [1..4]   of Real;
      UsedBus           : TBus;
      IsaBase           : Word;
      SMB_BASE          : Word;
      SMBusType         : TSMB;
      SMB_NAME          : String;
      SMBChipAddress    : Byte;
      ChipType          : Integer;
      TempL             : array[1..10] of Real;
      TempH             : array[1..10] of Real;
      TempA             : array[1..10] of Extended;
      TempC             : array[1..10] of LongInt;
      VoltL             : array[1..10] of Real;
      VoltH             : array[1..10] of Real;
      VoltA             : array[1..10] of Extended;
      VoltC             : array[1..10] of LongInt;
      FanL              : array[1..10] of Real;
      FanH              : array[1..10] of Real;
      FanA              : array[1..10] of Extended;
      FanC              : array[1..10] of LongInt;
      StartingTimeLog   : String;
      CurrentTimeLog    : String;
      CPUL              : array[1..4]  of Real;
      CPUH              : array[1..4]  of Real;
      CPUA              : array[1..4]  of Extended;
      CPUC              : array[1..4]  of LongInt;  
      TempName          : array[1..10] of String;
      VoltName          : array[1..10] of String;
      FanName           : array[1..10] of String;
      CPUName           : String;
      CPUUsageName      : String;
    function ReadSharedData : Boolean;
    function ReadSharedInfo : Boolean;
    function ReadSharedHL   : Boolean;
    function ReadSharedName : Boolean;
    implementation
    function ReadSharedData : Boolean;
    var
      PSH          : PSharedData;
      hSData       : Integer;
      X            : Integer;
    begin
      Result:=False;
      hSData:=OpenFileMapping(FILE_MAP_READ, False, '$M$B$M$5$D$');
      if hSData=0 then Exit;
      PSH:=MapViewOfFile(hSData, FILE_MAP_READ, 0, 0, 0);
      if PSH=Nil then
      begin
        CloseHandle(hSData);
        Exit;
      end;
      with PSH^ do
      begin
        for X:=1 to 10 do Temperature[X]:=STemperature[X];
        for X:=1 to 10 do Voltage[X]:=SVoltage[X];
        for X:=1 to 10 do Fan[X]:=SFan[X];
        CPUMHZ:=SMHZ;
        CPUNr:=SNrCPU;
        for X:=1 to 4 do CPU[X]:=SCPU[X];
      end;
      UnMapViewOfFile(PSH);
      CloseHandle(hSData);
      Result:=True;
    end;
    function ReadSharedInfo : Boolean;
    var
      PSH          : PSharedInfo;
      hSInfo       : Integer;
    begin
      Result:=False;
      hSInfo:=OpenFileMapping(FILE_MAP_READ, False, '$M$B$M$5$I$');
      if hSInfo=0 then Exit;
      PSH:=MapViewOfFile(hSInfo, FILE_MAP_READ, 0, 0, 0);
      if PSH=Nil then
      begin
        CloseHandle(hSInfo);
        Exit;
      end;
      with PSH^ do
      begin
        SMB_Base:=SSMB_Base;
        UsedBus:=SSMB_Type;
        SmbusType:=SSMB_Code;
        SMBChipAddress:=SSMB_Addr;
        SMB_Name:=StrPas(SSMB_Name);
        ISABase:=SISA_Base;
        ChipType:=SChipType;
        VoltageSubType:=SVoltageSubType;
      end;
      UnMapViewOfFile(PSH);
      CloseHandle(hSInfo);
      Result:=True;
    end;
    function ReadSharedHL : Boolean;
    var
      PSH          : PSharedHL;
      hSHL         : Integer;
      X            : Integer;
    begin
      Result:=False;
      hSHL:=OpenFileMapping(FILE_MAP_READ, False, '$M$B$M$5$H$');
      if hSHL =0 then Exit;
      PSH:=MapViewOfFile(hSHL, FILE_MAP_READ, 0, 0, 0);
      if PSH=Nil then
      begin
        CloseHandle(hSHL);
        Exit;
      end;
      with PSH^ do
      begin
        for X:=1 to 10 do
        begin
          TempL[X]:=STempL[X];
          TempH[X]:=STempH[X];
          TempA[X]:=STempA[X];
          TempC[X]:=STempC[X];
        end;
        for X:=1 to 10 do
        begin
          VoltL[X]:=SVoltL[X];
          VoltH[X]:=SVoltH[X];
          VoltA[X]:=SVoltA[X];
          VoltC[X]:=SVoltC[X];
        end;
        for X:=1 to 10 do
        begin
          FanL[X]:=SFanL[X];
          FanH[X]:=SFanH[X];
          FanA[X]:=SFanA[X];
          FanC[X]:=SFanC[X];
        end;
        StartingTimeLog:=StrPas(SStart);
        CurrentTimeLog:=StrPas(SCurrent);
        for X:=1 to 4 do
        begin
          CPUL[X]:=SCPUL[X];
          CPUH[X]:=SCPUH[X];
          CPUA[X]:=SCPUA[X];
          CPUC[X]:=SCPUC[X];
        end;
      end;
      UnMapViewOfFile(PSH);
      CloseHandle(hSHL);
      Result:=True;
    end;
    function ReadSharedName : Boolean;
    var
      PSH          : PSharedName;
      hSData       : Integer;
      X            : Integer;
    begin
      Result:=False;
      hSData:=OpenFileMapping(FILE_MAP_READ, False, '$M$B$M$5$N$');
      if hSData=0 then Exit;
      PSH:=MapViewOfFile(hSData, FILE_MAP_READ, 0, 0, 0);
      if PSH=Nil then
      begin
        CloseHandle(hSData);
        Exit;
      end;
      with PSH^ do
      begin
        for X:=1 to 10 do TempName[X]:=StrPas(STempName[X])
        for X:=1 to 10 do VoltName[X]:=StrPas(VoltName[X])
        for X:=1 to 10 do FanName[X]:=StrPas(FanName[X])
        CPUName:=StrPas(SCPUName);
        CPUUsageName:=StrPas(SCPUName);
      end;
      UnMapViewOfFile(PSH);
      CloseHandle(hSData);
      Result:=True;
    end;