Search code examples
delphiscreenbrightness

winapi change brightness


What winapi's are there to change the screen's brightness?

enter image description here

I've been attempting to look for an example or API I can use for Delphi but have not found anything.


Solution

  • Starting with Windows Vista you can use the GetMonitorBrightness and SetMonitorBrightness functions.

    function GetMonitorBrightness(
      hMonitor : THandle;
      var   pdwMinimumBrightness : DWORD;
      var   pdwCurrentBrightness : DWORD;
      var   pdwMaximumBrightness : DWORD
    ) : BOOL; stdcall ; external 'Dxva2.dll' name 'GetMonitorBrightness';
    
    
    function SetMonitorBrightness(
      hMonitor : THandle;
      dwNewBrightness : DWORD
    ): BOOL; stdcall ; external 'Dxva2.dll' name 'SetMonitorBrightness';
    

    Another option is use the WmiSetBrightness method of the WmiMonitorBrightnessMethods WMI Class.

    {$APPTYPE CONSOLE}
    
    uses
      SysUtils,
      ActiveX,
      Variants,
      ComObj;
    
    procedure  SetBrightness(Timeout : Integer; Brightness : Byte);
    var
      FSWbemLocator : OLEVariant;
      FWMIService   : OLEVariant;
      FWbemObjectSet: OLEVariant;
      FWbemObject   : OLEVariant;
      oEnum         : IEnumvariant;
      iValue        : LongWord;
    begin;
      FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
      FWMIService   := FSWbemLocator.ConnectServer('localhost', 'root\WMI', '', '');
      FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM WmiMonitorBrightnessMethods Where Active=True','WQL',$00000020);
      oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
      while oEnum.Next(1, FWbemObject, iValue) = 0 do
      begin
        FWbemObject.WmiSetBrightness(Timeout, Brightness);
        FWbemObject:=Unassigned;
      end;
    end;
    
    
    begin
     try
        CoInitialize(nil);
        try
          SetBrightness(5, 100);
        finally
          CoUninitialize;
        end;
     except
        on E:EOleException do
            Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
        on E:Exception do
            Writeln(E.Classname, ':', E.Message);
     end;
     Writeln('Press Enter to exit');
     Readln;
    end.
    

    Note: These functions are supported if the GetMonitorCapabilities function returns the MC_CAPS_BRIGHTNESS flag.