【问题标题】:winapi change brightnesswinapi改变亮度
【发布时间】:2013-04-16 01:06:18
【问题描述】:

有什么winapi可以改变屏幕亮度?

我一直在尝试寻找可以用于 Delphi 的示例或 API,但没有找到任何东西。

【问题讨论】:

    标签: delphi screen brightness


    【解决方案1】:

    从 Windows Vista 开始,您可以使用 GetMonitorBrightnessSetMonitorBrightness 函数。

    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';
    

    另一种选择是使用WmiMonitorBrightnessMethods WMI 类的WmiSetBrightness 方法。

    {$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.
    

    注意:如果 GetMonitorCapabilities 函数返回 MC_CAPS_BRIGHTNESS 标志,则支持这些函数。

    【讨论】:

    • 谢谢!这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多