How can I write a Delphi program to control CPU fan speed and temperature control?

I want to use Delphi to create a program that controls the speed of my computer’s fan and controls the temperature.

What API calls are related to this?

Are there any good code samples you can provide?

+4
source share
2 answers

You can use the Win32_TemperatureProbe and Win32_Fan WMI classes, from delphi you must import the Microsoft WMIScripting V1.x library using Component-> Import Component-> Import type library-> Next β†’ "Select Library" β†’ Next-> Add Block to Project-> Done.

See this code. This is a simple example.

program GetWMI_Info; {$APPTYPE CONSOLE} uses ActiveX, Variants, SysUtils, WbemScripting_TLB in '..\..\..\Documents\RAD Studio\5.0\Imports\WbemScripting_TLB.pas'; procedure ShowTemperatureInfo(); var WMIServices: ISWbemServices; Root : ISWbemObjectSet; Item : Variant; I : Integer; begin { http://msdn.microsoft.com/en-us/library/aa394493%28VS.85%29.aspx The Win32_TemperatureProbe WMI class represents the properties of a temperature sensor (electronic thermometer). Most of the information that the Win32_TemperatureProbe WMI class provides comes from SMBIOS. Real-time readings for the CurrentReading property cannot be extracted from SMBIOS tables. For this reason, current implementations of WMI do not populate the CurrentReading property. The CurrentReading property presence is reserved for future use. } Writeln('Temperature Info'); Writeln('----------------'); WMIServices := CoSWbemLocator.Create.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil); Root := WMIServices.ExecQuery('Select * FROM Win32_TemperatureProbe','WQL', 0, nil); for I := 0 to Root.Count - 1 do begin Item := Root.ItemIndex(I); Writeln('Accuracy '+VarToStr(Item.Accuracy)); Writeln('Availability '+VarToStr(Item.Availability)); Writeln('Caption '+Item.Caption); Writeln('Config Manager Error Code '+VarToStr(Item.ConfigManagerErrorCode)); Writeln('Config Manager User Config '+VarToStr(Item.ConfigManagerUserConfig)); Writeln('Creation Class Name '+VarToStr(Item.CreationClassName)); Writeln('Current Reading '+VarToStr(Item.CurrentReading)); Writeln('Description '+VarToStr(Item.Description)); Writeln('Device ID '+VarToStr(Item.DeviceID)); Writeln('Error Cleared '+VarToStr(Item.ErrorCleared )); Writeln('Error Description '+VarToStr(Item.ErrorDescription)); Writeln('Install Date '+VarToStr(Item.InstallDate)); Writeln('Is Linear '+VarToStr(Item.IsLinear)); Writeln('Last Error Code '+VarToStr(Item.LastErrorCode)); Writeln('Lower Threshold Critical '+VarToStr(Item.LowerThresholdCritical)); Writeln('Lower Threshold Fatal '+VarToStr(Item.LowerThresholdFatal)); Writeln('Lower Threshold NonCritical '+VarToStr(Item.LowerThresholdNonCritical)); Writeln('Max Readable '+VarToStr(Item.MaxReadable)); Writeln('Min Readable '+VarToStr(Item.MinReadable)); Writeln('Name '+VarToStr(Item.Name)); Writeln('Nominal Reading '+VarToStr(Item.NominalReading)); Writeln('Normal Max '+VarToStr(Item.NormalMax)); Writeln('Normal Min '+VarToStr(Item.NormalMin )); Writeln('PNP Device ID '+VarToStr(Item.PNPDeviceID)); Writeln('Power Management Capabilities '+VarToStr(Item.PowerManagementCapabilities)); Writeln('Power Management Supported '+VarToStr(Item.PowerManagementSupported)); Writeln('Resolution '+VarToStr(Item.Resolution)); Writeln('Status '+VarToStr(Item.Status)); Writeln('Status Info '+VarToStr(Item.StatusInfo)); Writeln('System Creation Class Name '+VarToStr(Item.SystemCreationClassName)); Writeln('System Name '+VarToStr(Item.SystemName)); Writeln('Tolerance '+VarToStr(Item.Tolerance)); Writeln('Upper Threshold Critical '+VarToStr(Item.UpperThresholdCritical)); Writeln('Upper Threshold Fatal '+VarToStr(Item.UpperThresholdFatal)); Writeln('Upper Threshold NonCritical '+VarToStr(Item.UpperThresholdNonCritical)); Writeln(''); end; end; procedure ShowCPUFanInfo(); var WMIServices: ISWbemServices; Root : ISWbemObjectSet; Item : Variant; I : Integer; begin { http://msdn.microsoft.com/en-us/library/aa394146%28VS.85%29.aspx The Win32_Fan WMI class represents the properties of a fan device in the computer system. For example, the CPU cooling fan. } Writeln('CPU FAN Info'); Writeln('----------------'); WMIServices := CoSWbemLocator.Create.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil); Root := WMIServices.ExecQuery('Select * FROM Win32_Fan','WQL', 0, nil); for I := 0 to Root.Count - 1 do begin Item := Root.ItemIndex(I); Writeln('ActiveCooling '+VarToStr(Item.ActiveCooling)); Writeln('Availability '+VarToStr(Item.Availability)); Writeln('Caption '+VarToStr(Item.Caption)); Writeln('Config Manager ErrorCode '+VarToStr(Item.ConfigManagerErrorCode)); Writeln('Config Manager UserConfig '+VarToStr(Item.ConfigManagerUserConfig)); Writeln('Creation ClassName '+VarToStr(Item.CreationClassName)); Writeln('Description '+VarToStr(Item.Description)); Writeln('DesiredSpeed '+VarToStr(Item.DesiredSpeed)); Writeln('DeviceID '+VarToStr(Item.DeviceID)); Writeln('ErrorCleared '+VarToStr(Item.ErrorCleared)); Writeln('ErrorDescription '+VarToStr(Item.ErrorDescription)); Writeln('InstallDate '+VarToStr(Item.InstallDate)); Writeln('LastErrorCode '+VarToStr(Item.LastErrorCode)); Writeln('Name '+VarToStr(Item.Name)); Writeln('PNPDeviceID '+VarToStr(Item.PNPDeviceID)); Writeln('PowerManagement Capabilities '+VarToStr(Item.PowerManagementCapabilities)); Writeln('PowerManagement Supported '+VarToStr(Item.PowerManagementSupported)); Writeln('Status '+VarToStr(Item.Status)); Writeln('StatusInfo '+VarToStr(Item.StatusInfo)); Writeln('SystemCreation ClassName '+VarToStr(Item.SystemCreationClassName)); Writeln('SystemName '+VarToStr(Item.SystemName)); Writeln('VariableSpeed '+VarToStr(Item.VariableSpeed)); Writeln(''); end; End; begin try CoInitialize(nil); ShowTemperatureInfo(); ShowCPUFanInfo(); Readln; CoUninitialize; except on E:Exception do Begin CoUninitialize; Writeln(E.Classname, ': ', E.Message); Readln; End; end; end. 
+9
source

You can use WMI to access the fan speed (and other statistics, such as temperature). A good example of using WMI in Delphi can be found at Magenta Systems .

+2
source

All Articles