Bildschirmhelligkeit unter Windows 10 einstellen

Aus Fingers Wiki
Wechseln zu: Navigation, Suche

Unter Windows 10 kann man Bildschirmhelligkeit, zumindest auf einem Tablet, recht einfach über einen Klick auf das Akkusymbol und dort die große Schaltfläche ändern, aber nur in 25%-Schritten. Das ist mir zu grob. Insbesondere Abends im Bett reichen 10-15% völlig aus, alles andere ist zu hell. Das einzustellen ist aber mit viel Klickerei verbunden. Vor einiger Zeit hatte ich mir schon ein Power-Shell-Skript geschrieben, mit dem man über schön große Buttons vordefinierte Helligkeiten einstellen kann. Gesetzt wurde das mit einer im Internet häufig zu findenden Funktion 'WmiSetBrigthness'. Das funktionierte zwar, war aber nicht sehr dauerhaft. Sobald man die externe Stromversorgung an- oder abgesteckt hat, wurde die im Energieschema festgelegte Helligkeit wiederhergestellt, meistens also 25%, manchmal auch was anderes aus den 25%-Stufen, je nach dem, was vorher über das Akkusymbol eingestellt war. Manchmal wurde diese (zu hohe) Helligkeit auch beim reaktivieren aus dem Standby gesetzt. Insgesamt also eher unbefriedigend.

Dass man die Bildschirmhelligkeit auch dauerhaft über das Akkusymbol ändern kann, hat mir keine Ruhe gelassen, das müsste doch auch für andere Programme zugänglich sein. Ist es auch, nur ist das etwas komplizierter. Setzten kann man die Helligkeit auch über die Funktion 'powercfg' mit den richtigen Parametern. Man kann Parameter der verfügbaren Energieschemata ändern, dazu gehört auch die Bildschirmhelligkeit bei Netz- und bei Akkubetrieb. Dafür braucht man nur die passenden GUIDs. Mit etwas Skript-Frickelei bekommt man die GUID des aktuell verwendeten Energieschemas raus und die der Bildschirmhelligkeitseinstellung und der Funktionsgruppe, zu der das gehört auch. Das alles packt man in einen entsprechenden Befehl und man bekommt... Fehlermeldungen.

Warum? Weil die Parameterübergabe uneinheitlich ist. Überall (insbesondere bei Microsoft selbst) steht geschrieben, dass man das so aufruft 'powercfg -Unterfunktion Parameter', die Hilfe ('powercfg -?' oder 'powercfg /?' ist egal) erzählt was von 'powercfg /Unterfunktion Parameter'. In der Shell (cmd.exe) funktioniert nur die Variante mit Bindestrich '-'. Genauso geschrieben auch in einem Beispiel für die Power-Shell, z.B. 'powercfg -getactivescheme' funktioniert wunderbar. Nur bei den Unterfunktionen 'setacvalueindex' und 'setdcvalueindex' mosert die Power-Shell rum, dass das unbekannte Funktionen wären. Mit Slash '/' funktioniert dass dann ohne Fehlermeldung, der Bildschirm behält aber trotzdem seine Helligkeit bei... Solange, bis man rausfindet, dass man die Änderung noch aktivieren muss, indem man das eigentlich aktuelle Energieschema noch mal als aktiv setzen muss ('powercfg /setactive $SchemeGUID'). Dann, endlich, wird die Bildschirmhelligkeit ordentlich gesetzt. Hurra!


Das Skript ist unten, weil man hier keine Nicht-Bild-Dateien hochladen kann.


Um das Skript einfach aufzurufen, macht man sich eine Verknüpfung auf dem Desktop zu 'powershell.exe'. Bei mir ist das 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'. Diese Verknüpfung bearbeitet man dann und fügt beim Verknüpfungsziel noch hinzu ' -WindowStyle Hidden -Command "& 'FullPathAndNameOfSkript.ps1'" '. Im Verknüpfungsziel steht dann also zum Beispiel:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Hidden -Command "& 'D:\MeineGanzenSkripe\PowerShellSkripte\SetScreenBrightness.ps1'"

Das '-WindowsStyle Hidden' sorgt dafür, dass kein Shellfenster für das Skript auf gemacht wird, das wird sowieso nicht gebraucht. Das '-Command' ist der Hinweis, das mit dem Start der Power-Shell direkt ein Kommando übergeben werden soll. Das Kommando steht in Anführungszeichen (") und beginnt mit dem kaufmännischen &. Dahinter wird in Hochkommata eingeschlossen das Skript mit seinem kompletten Pfad geschrieben, also zum Beispiel 'D:\MeineSkripte\PowerShell\SetScreenBrigthness.ps1'. Wichtig ist, dass dann am Schluss ein Hochkomma und Anführungszeichen hintereinander kommen. Im Skript habe ich das auch noch mal oben rein geschrieben. Wenn man das Skript ausführt, bekommt man ein Fenster mit 13 Buttons, 12 für die Helligkeit und ein Cancel. Die Helligkeitsbuttons sind mit den Prozentwerten beschriftet. Wenn man das ändern möchte, kann man das im Code für jeden Button an den Stellen mit

$Button2.Text = "5%"
$Button2.Add_Click({$global:x=5;$objForm.Close()})

machen.

Die erste Zeile ist für die Button-Beschriftung, in der zweiten Zeile ist die Zuweisung '$global:x=5' die Stelle, an der der entsprechende Prozentwert für die weitere Verarbeitung gespeichert wird.

Noch ein weiterer Hinweis: Damit überhaupt Skripte ausgeführt werden dürfen, muss man ein Mal ein Power-Shell-Fenster aufmachen und 'Set-ExecutionPolicy Unrestricted' eingeben. Damit werden dann auch nicht-signierte, also auch selbst geschriebene Skripte ausgeführt. In der Grundeinstellung werden nur direkt eingegebene Befehle, aber keine Skripte ausgeführt.




So, hier das Skript. Das ganze in eine Textdatei kopieren und unter 'SetScreenBrigthness.ps1' abspeichern:


# To run the skript from a desktop icon, make a link to
# C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Hidden -Command "& 'FullPathAndNameOfSkript.ps1'"

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 

$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "Set Screen Brightness"
$objForm.Size = New-Object System.Drawing.Size(300,150) 
$objForm.StartPosition = "CenterScreen"
$objForm.AutoSize = $True

$global:x=-10

$NormalButtonStartX=0
$NormalButtonStartY=0
$NormalButtonWidthX=100
$NormalButtonWidthY=100

$CancelButtonWidthX=4*$NormalButtonWidthX
$CancelButtonWidthY=0.75*$NormalButtonWidthY

$CurrentButtonLocationX=$NormalButtonStartX+$NormalButtonWidthX * 0
$CurrentButtonLocationY=$NormalButtonStartY+$NormalButtonWidthY * 0
$Button1 = New-Object System.Windows.Forms.Button
$Button1.Location = New-Object System.Drawing.Size($CurrentButtonLocationX, $CurrentButtonLocationY)
$Button1.Size = New-Object System.Drawing.Size($NormalButtonWidthX, $NormalButtonWidthY)
$Button1.Text = "0%"
$Button1.Add_Click({$global:x=0;$objForm.Close()})
$objForm.Controls.Add($Button1)

$CurrentButtonLocationX=$NormalButtonStartX+$NormalButtonWidthX * 1
$CurrentButtonLocationY=$NormalButtonStartY+$NormalButtonWidthY * 0
$Button2 = New-Object System.Windows.Forms.Button
$Button2.Location = New-Object System.Drawing.Size($CurrentButtonLocationX, $CurrentButtonLocationY)
$Button2.Size = New-Object System.Drawing.Size($NormalButtonWidthX, $NormalButtonWidthY)
$Button2.Text = "5%"
$Button2.Add_Click({$global:x=5;$objForm.Close()})
$objForm.Controls.Add($Button2)

$CurrentButtonLocationX=$NormalButtonStartX+$NormalButtonWidthX * 2
$CurrentButtonLocationY=$NormalButtonStartY+$NormalButtonWidthY * 0
$Button3 = New-Object System.Windows.Forms.Button
$Button3.Location = New-Object System.Drawing.Size($CurrentButtonLocationX, $CurrentButtonLocationY)
$Button3.Size = New-Object System.Drawing.Size($NormalButtonWidthX, $NormalButtonWidthY)
$Button3.Text = "10%"
$Button3.Add_Click({$global:x=10;$objForm.Close()})
$objForm.Controls.Add($Button3)

$CurrentButtonLocationX=$NormalButtonStartX+$NormalButtonWidthX * 3
$CurrentButtonLocationY=$NormalButtonStartY+$NormalButtonWidthY * 0
$Button4 = New-Object System.Windows.Forms.Button
$Button4.Location = New-Object System.Drawing.Size($CurrentButtonLocationX, $CurrentButtonLocationY)
$Button4.Size = New-Object System.Drawing.Size($NormalButtonWidthX, $NormalButtonWidthY)
$Button4.Text = "15%"
$Button4.Add_Click({$global:x=15;$objForm.Close()})
$objForm.Controls.Add($Button4)

$CurrentButtonLocationX=$NormalButtonStartX+$NormalButtonWidthX * 0
$CurrentButtonLocationY=$NormalButtonStartY+$NormalButtonWidthY * 1
$Button5 = New-Object System.Windows.Forms.Button
$Button5.Location = New-Object System.Drawing.Size($CurrentButtonLocationX, $CurrentButtonLocationY)
$Button5.Size = New-Object System.Drawing.Size($NormalButtonWidthX, $NormalButtonWidthY)
$Button5.Text = "20%"
$Button5.Add_Click({$global:x=20;$objForm.Close()})
$objForm.Controls.Add($Button5)

$CurrentButtonLocationX=$NormalButtonStartX+$NormalButtonWidthX * 1
$CurrentButtonLocationY=$NormalButtonStartY+$NormalButtonWidthY * 1
$Button6 = New-Object System.Windows.Forms.Button
$Button6.Location = New-Object System.Drawing.Size($CurrentButtonLocationX, $CurrentButtonLocationY)
$Button6.Size = New-Object System.Drawing.Size($NormalButtonWidthX, $NormalButtonWidthY)
$Button6.Text = "25%"
$Button6.Add_Click({$global:x=25;$objForm.Close()})
$objForm.Controls.Add($Button6)

$CurrentButtonLocationX=$NormalButtonStartX+$NormalButtonWidthX * 2
$CurrentButtonLocationY=$NormalButtonStartY+$NormalButtonWidthY * 1
$Button7 = New-Object System.Windows.Forms.Button
$Button7.Location = New-Object System.Drawing.Size($CurrentButtonLocationX, $CurrentButtonLocationY)
$Button7.Size = New-Object System.Drawing.Size($NormalButtonWidthX, $NormalButtonWidthY)
$Button7.Text = "30%"
$Button7.Add_Click({$global:x=30;$objForm.Close()})
$objForm.Controls.Add($Button7)

$CurrentButtonLocationX=$NormalButtonStartX+$NormalButtonWidthX * 3
$CurrentButtonLocationY=$NormalButtonStartY+$NormalButtonWidthY * 1
$Button8 = New-Object System.Windows.Forms.Button
$Button8.Location = New-Object System.Drawing.Size($CurrentButtonLocationX, $CurrentButtonLocationY)
$Button8.Size = New-Object System.Drawing.Size($NormalButtonWidthX, $NormalButtonWidthY)
$Button8.Text = "40%"
$Button8.Add_Click({$global:x=40;$objForm.Close()})
$objForm.Controls.Add($Button8)

$CurrentButtonLocationX=$NormalButtonStartX+$NormalButtonWidthX * 0
$CurrentButtonLocationY=$NormalButtonStartY+$NormalButtonWidthY * 2
$Button9 = New-Object System.Windows.Forms.Button
$Button9.Location = New-Object System.Drawing.Size($CurrentButtonLocationX, $CurrentButtonLocationY)
$Button9.Size = New-Object System.Drawing.Size($NormalButtonWidthX, $NormalButtonWidthY)
$Button9.Text = "50%"
$Button9.Add_Click({$global:x=50;$objForm.Close()})
$objForm.Controls.Add($Button9)

$CurrentButtonLocationX=$NormalButtonStartX+$NormalButtonWidthX * 1
$CurrentButtonLocationY=$NormalButtonStartY+$NormalButtonWidthY * 2
$Button10 = New-Object System.Windows.Forms.Button
$Button10.Location = New-Object System.Drawing.Size($CurrentButtonLocationX, $CurrentButtonLocationY)
$Button10.Size = New-Object System.Drawing.Size($NormalButtonWidthX, $NormalButtonWidthY)
$Button10.Text = "60%"
$Button10.Add_Click({$global:x=60;$objForm.Close()})
$objForm.Controls.Add($Button10)

$CurrentButtonLocationX=$NormalButtonStartX+$NormalButtonWidthX * 2
$CurrentButtonLocationY=$NormalButtonStartY+$NormalButtonWidthY * 2
$Button11 = New-Object System.Windows.Forms.Button
$Button11.Location = New-Object System.Drawing.Size($CurrentButtonLocationX, $CurrentButtonLocationY)
$Button11.Size = New-Object System.Drawing.Size($NormalButtonWidthX, $NormalButtonWidthY)
$Button11.Text = "75%"
$Button11.Add_Click({$global:x=75;$objForm.Close()})
$objForm.Controls.Add($Button11)

$CurrentButtonLocationX=$NormalButtonStartX+$NormalButtonWidthX * 3
$CurrentButtonLocationY=$NormalButtonStartY+$NormalButtonWidthY * 2
$Button12 = New-Object System.Windows.Forms.Button
$Button12.Location = New-Object System.Drawing.Size($CurrentButtonLocationX, $CurrentButtonLocationY)
$Button12.Size = New-Object System.Drawing.Size($NormalButtonWidthX, $NormalButtonWidthY)
$Button12.Text = "100%"
$Button12.Add_Click({$global:x=100;$objForm.Close()})
$objForm.Controls.Add($Button12)

$CurrentButtonLocationX=$NormalButtonStartX+$NormalButtonWidthX * 0;
$CurrentButtonLocationY=$NormalButtonStartY+$NormalButtonWidthY * 3;
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size($CurrentButtonLocationX, $CurrentButtonLocationY)
$CancelButton.Size = New-Object System.Drawing.Size($CancelButtonWidthX, $CancelButtonWidthY)
$CancelButton.Text = "Cancel"
#$CancelButton.Add_Click({$global:x=-1;$objForm.Close()})
$CancelButton.Add_Click({$global:x=-1;$objForm.Close()})
$objForm.Controls.Add($CancelButton)

$objForm.Topmost = $True

$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()

if ($global:x -gt -1)
{
    [int]$brightness = $global:x
    #$delay = 0
    #$myMonitor = Get-WmiObject -Namespace root\wmi -Class WmiMonitorBrightnessMethods
    #$myMonitor.WmiSetBrightness($delay, $brightness)


    # Lets Check what is our Current Active "Power Scheme" and put it on a Variable 
    $currScheme = POWERCFG /GETACTIVESCHEME  

    # Put $CurrScheme in a variable and Spilt is so that we can get the GUID of Active "Power Scheme" 
    $y = $currScheme.Split() 
    $SchemeGUID=$y[3]

    # Sub-GUID der Untergruppe: 7516b95f-f776-4464-8c53-06167f40cc99  (Bildschirm)
    # Setting-GUID der Energieeinstellung: aded5e82-b909-4619-9949-f5d71dac0bcb  (Bildschirmhelligkeit)

    # powercfg /setacvalueindex Scheme_GUID Sub_GUID Setting_GUID Value

    powercfg /setacvalueindex $SchemeGUID 7516b95f-f776-4464-8c53-06167f40cc99 aded5e82-b909-4619-9949-f5d71dac0bcb $brightness
    powercfg /setdcvalueindex $SchemeGUID 7516b95f-f776-4464-8c53-06167f40cc99 aded5e82-b909-4619-9949-f5d71dac0bcb $brightness
    powercfg /setactive $SchemeGUID
}