unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 =
class(TForm)
Label1: TLabel;
CPUFREQ1: TLabel;
Label3: TLabel;
CPUFREQ2: TLabel;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
N, CIS, MIS : Cardinal;
const
powrproflib = '
powrprof.dll';
type
PROCESSOR_POWER_INFORMATION =
packed record
Number: Cardinal;
MaxMhz: Cardinal;
CurrentMhz: Cardinal;
MhzLimit: Cardinal;
MaxIdleState: Cardinal;
CurrentIdleState: Cardinal;
end;
PPROCESSOR_POWER_INFORMATION = ^PROCESSOR_POWER_INFORMATION;
TCPUFrequency =
packed record
CurrentMhz: Cardinal;
MaxMhz: Cardinal;
MhzLimit: Cardinal;
end;
var
CPUFrequency: TCPUFrequency;
implementation
{$R *.dfm}
function CallNtPowerInformation(InformationLevel: DWORD; InPutBuffer: Pointer; InputBufferSize: ULONG; OutPutBuffer:
Pointer; OutPutBufferSize: ULONG): DWORD;
stdcall;
external powrproflib;
function GetCPUFrequency(
var CPUFrequency: TCPUFrequency): DWORD;
var
ppi: PROCESSOR_POWER_INFORMATION;
err: DWORD;
begin
ZeroMemory(@ppi, sizeof(PROCESSOR_POWER_INFORMATION));
err := CallNTPowerInformation(11,
nil, 0, @ppi, sizeof(PROCESSOR_POWER_INFORMATION));
if err = 0
then
begin
CPUFrequency.CurrentMhz := ppi.CurrentMhz;
CPUFrequency.MaxMhz := ppi.MaxMhz;
CPUFrequency.MhzLimit := ppi.MhzLimit;
N:= ppi.Number;
CIS:= ppi.CurrentIdleState;
MIS:= ppi.MaxIdleState;
end;
result := err;
end;
function ReadFREQ : Boolean;
var
err: DWORD;
begin
ZeroMemory(@CPUFrequency, sizeof(TCPUFrequency));
err := GetCPUFrequency(CPUFrequency);
if err = 0
then result:= true
else result:= false;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
If ReadFREQ = true
then
BEGIN
CPUFREQ1.Caption:= IntToStr(Round(CPUFrequency.CurrentMhz
div 10 +1)* 10)+'
MHz';
CPUFREQ2.Caption:= IntToStr(Round(CPUFrequency.MaxMhz
div 10 +1)* 10)+'
MHz';
END;
end;
end.