Seite 1 von 1

Laptop-Display-Helligkeit (nicht Gamma-Wert)

Verfasst: 11.09.2010 14:53
von GPI
Wer schon immer mal die Helligkeit seines Laptop-Displays ändern wollte (hiermit ist *NICHT* der Gamma-Wert gemeint!) dürfte sich hierrüber freuen:

Code: Alles auswählen

#IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS = $00230498 
#IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS = $0023049C
#IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS  = $00230494

Structure DISPLAY_BRIGHTNESS
  ucDisplayPolicy.b ;1=ac Strom, 2=dc Akku, 3=beides
  ucACBrightness.b
  ucDCBrightness.b
EndStructure

Global Dim BrightLevel.b(257); Mögliche Farbstufen
Global maxBrightLevel=-1 ; Anzahl Stufen
Global hLCD.i=#INVALID_HANDLE_VALUE ; Handle des Bildschirms

Global displayBrightness.DISPLAY_BRIGHTNESS

Declare GetLCDhandle()

Procedure GetSupportedBrightness(); Unterstütze Helligkeitsstufen, maxStufen
  Protected returnedBytes.l
  If maxBrightLevel<1
    ; Bisher keine Zwischenstufen abgefragt
    If GetLCDhandle()
      If DeviceIoControl_(hlcd,#IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS,#Null,0,@BrightLevel()+1,256,@returnedbytes,#Null)
        maxBrightLevel=returnedBytes+1
        BrightLevel(0)=0
        BrightLevel(maxBrightLevel)=100
        ;For i=0 To maxstufen
        ;  Debug Str(i)+" "+Str(stufen(i))
        ;Next
      EndIf
    EndIf
  EndIf 
  ProcedureReturn maxBrightLevel
EndProcedure
Procedure GetCurrentBrightness(); gibt aktuelle helligekeit zurück oder -1
  Protected returnedbytes.l
  If getlcdhandle()
    If DeviceIoControl_(hlcd,  #IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS,#Null,0,@displayBrightness, SizeOf(displayBrightness),@returnedBytes,#Null)
      If displayBrightness\ucDisplayPolicy =1
        ProcedureReturn displayBrightness\ucACBrightness
      Else
        ProcedureReturn displaybrightness\ucDCBrightness
      EndIf
    EndIf
  EndIf
  ProcedureReturn -1
EndProcedure
Procedure GetCurrentLevel();Helligkeit in Stufen
  Protected cur.l,ret.l
  ret=-1
  If GetSupportedBrightness()>0
    cur=GetCurrentBrightness()
    ;Debug "Current:"+Str(cur)
    For i=0 To maxBrightLevel
      If cur>=BrightLevel(i)
        ret=i
      EndIf
    Next
  EndIf
  ProcedureReturn ret
EndProcedure
Procedure SetCurrentBrightness(Value.b)
  Protected returnedBytes.l
  If GetCurrentBrightness()>-1
    If displaybrightness\ucDisplayPolicy=1
      displayBrightness\ucACBrightness=Value
    Else
      displayBrightness\ucDCBrightness=Value
    EndIf
    ProcedureReturn DeviceIoControl_(hLCD, #IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS, @displayBrightness, SizeOf(displayBrightness), #Null, 0, @returnedBytes, #Null)
  EndIf
EndProcedure
Procedure SetCurrentLevel(Level)
  If GetSupportedBrightness()>0
    If level>=0 And level<=maxBrightLevel
      ProcedureReturn SetCurrentBrightness(BrightLevel(Level) ) 
    EndIf
  EndIf
  ProcedureReturn 0
EndProcedure
Procedure GetLCDhandle()
  If hlcd=#INVALID_HANDLE_VALUE
    hLCD = CreateFile_("\\.\LCD", #GENERIC_READ, #FILE_SHARE_READ | #FILE_SHARE_WRITE, #Null, #OPEN_EXISTING, 0, #Null)
  EndIf
  If hlcd=#INVALID_HANDLE_VALUE
    ProcedureReturn #False
  Else
    ProcedureReturn #True
  EndIf
EndProcedure
Procedure CloseLCDhandle()
  If hlcd<>#INVALID_HANDLE_VALUE
    CloseHandle_(hLCD)
    hlcd=#INVALID_HANDLE_VALUE
  EndIf  
EndProcedure
mit GetSupportedBrightness() wird abgefragt, welche Helligkeitsstufen von Display unterstützt werden.
BrightLevel.b(0-x) werden die Werte gespeichert und maxBrightLevel gibt an, wie hoch x sein kann.

SetCurrentLevel(Level)/GetCurrentLevel() setzt bzw. fragt den aktuelle Helligkeit ab (kann zwischen 0-BrightLevel liegen)

GetCurrentBrightness()/SetCurrentBrightness(Value) fragt/Setzt die Helligkeit. Der Wer kann zwischen 0 - 100 liegen. Achtung man kann nur die Werte hernehmen, die das Display unterstützt. Diese Werte kann man mit GetSupportedBrightness abfragen.

Mein Display unterstützt bspw. nur 0,15,24,30,45,60,80,100%.

Re: Laptop-Display-Helligkeit (nicht Gamma-Wert)

Verfasst: 11.09.2010 17:04
von 7x7
Hallo GPI! Warst aber lange im Urlaub. :D