Geisterbeleuchtung und Powershell
Moin zusammen!
Für die verschiedenen Apps auf meinem PC möchte ich unterschiedliche Bildschirmhelligkeiten nutzen. Um z.B. beim Skypen keine Geisterbeleuchtung fürs Gesicht zu haben (wenn weiße Dokumentenseiten im Spiel sind) reduziere ich die Helligkeit gerne auf 50%, was auch sonst meist ausreicht. Für Powerpoint, Filme oder Bildbearbeitung benötige dagegen Full Power. Für PPT hatte ich die Idee per VBA Auto_Open und Sendkey die Helligkeit einzustellen, was schon daran scheitert, dass PPT Auto_Open nur mit hohem Aufwand (Programmierung eines eigenen Add-Ins) verarbeiten kann, meine Bildbearbeitung oder VLC gar kein VBA kennt.
Also Idee #2: Power Shell. Gefunden habe ich (als PS Laie) dazu:
wobei das x in der letzten Klammer für den Prozentsatz Helligkeit stehen soll.
Als Fehlermeldung erhalte ich:
womit ich genau nichts anfangen kann.
Wie funktionierts richtig? Als Lösung soll dann die jeweilige App nach Einstellung der Helligkeit gestartet, danach wieder auf einen zuvor eingelesenen oder fixen Wert gesetzt werden.
Ach ja: Win 10.0.19043.1466 PowerShell 5.1.19041.1320
Vielen Dank vorab!!
Spinnifex
Für die verschiedenen Apps auf meinem PC möchte ich unterschiedliche Bildschirmhelligkeiten nutzen. Um z.B. beim Skypen keine Geisterbeleuchtung fürs Gesicht zu haben (wenn weiße Dokumentenseiten im Spiel sind) reduziere ich die Helligkeit gerne auf 50%, was auch sonst meist ausreicht. Für Powerpoint, Filme oder Bildbearbeitung benötige dagegen Full Power. Für PPT hatte ich die Idee per VBA Auto_Open und Sendkey die Helligkeit einzustellen, was schon daran scheitert, dass PPT Auto_Open nur mit hohem Aufwand (Programmierung eines eigenen Add-Ins) verarbeiten kann, meine Bildbearbeitung oder VLC gar kein VBA kennt.
Also Idee #2: Power Shell. Gefunden habe ich (als PS Laie) dazu:
(Get-WmiObject -Namespace root / WMI –Class WmiMonitorBrightnessMethods) .WmiSetBrightness (1, x)
Als Fehlermeldung erhalte ich:
In Zeile:1 Zeichen:74
+ ... t / WMI –Class WmiMonitorBrightnessMethods) .WmiSetBrightness (1, 100 ...
+ ~~~~~~~~~~~~~~~~~
Unerwartetes Token ".WmiSetBrightness" in Ausdruck oder Anweisung.
+ CategoryInfo : ParserError: (:) , ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
Wie funktionierts richtig? Als Lösung soll dann die jeweilige App nach Einstellung der Helligkeit gestartet, danach wieder auf einen zuvor eingelesenen oder fixen Wert gesetzt werden.
Ach ja: Win 10.0.19043.1466 PowerShell 5.1.19041.1320
Vielen Dank vorab!!
Spinnifex
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1774184509
Url: https://administrator.de/contentid/1774184509
Ausgedruckt am: 22.11.2024 um 06:11 Uhr
21 Kommentare
Neuester Kommentar
Servus,
du hast da einige Syntax-Fehler eingebaut, viele Leerzeichen wo sie nicht hin gehören.
Grüße Uwe
du hast da einige Syntax-Fehler eingebaut, viele Leerzeichen wo sie nicht hin gehören.
Wie funktionierts richtig? Als Lösung soll dann die jeweilige App nach Einstellung der Helligkeit gestartet, danach wieder auf einen zuvor eingelesenen oder fixen Wert gesetzt werden.
Ein Beispiel wie es funktioniert# hide powershell console window
Add-Type –MemberDefinition '[DllImport("user32.dll")]public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);' -name Window -namespace W32
[void][W32.Window]::ShowWindow((Get-Process -id $pid).MainWindowHandle, 0)
# get current brightness level
$startLevel = (Get-CimInstance -Namespace root\wmi -ClassName WMIMonitorBrightness).CurrentBrightness
# set new brightness level to 50%
(Get-WMIObject -Namespace root\WMI -Class WMiMonitorBrightnessMethods).WMISetBrightness(1,50)
# start app and wait until application is closed
start "notepad" -Wait
# restore to old brightness
(Get-WMIObject -Namespace root\WMI -Class WMiMonitorBrightnessMethods).WMISetBrightness(1,$startLevel)
Zitat von @spinnifex:
Moin Uwe!
vielen Dank für Dein Snippet! Ich habe es eben etwas modifiziert (notepad wurde mit/ohne .exe schonmal nicht gestartet, FF geht)
Geht hier einwandfrei. Im Zweifel natürlich den kompletten Pfad angeben.Moin Uwe!
vielen Dank für Dein Snippet! Ich habe es eben etwas modifiziert (notepad wurde mit/ohne .exe schonmal nicht gestartet, FF geht)
Der PC ist ein Laptop mit geschlossenem Display (Bildschirm 3), gesteuert werden soll der Desktop-Monitor (1|2).
Dann wundert mich das nicht denn das Beispiel ist für das eingebaute Display des Notebooks, die Helligkeit von externen Bildschirmen lässt sich mit o.g. Skript nicht steuern, da musst du über die Win32 Methoden gehen.
👍
Ich könnte hier jetzt ein Gerüst dafür in PS posten, habe aber gerade kein Multi-Monitor Setup zur Hand um es testen zu können daher lasse ich das vorerst, sobald ich mal an einem System sitze werden ich das nachholen, selbst nicht getesteten Code zu posten mache ich nicht so gerne. Des weiteren Funktionieren die Methoden auch nicht mit allen Monitor-Typen, nur mit mit denen die das auch in Ihren Capabilities supporten und dem System mitteilen.
Grüße Uwe
Ich könnte hier jetzt ein Gerüst dafür in PS posten, habe aber gerade kein Multi-Monitor Setup zur Hand um es testen zu können daher lasse ich das vorerst, sobald ich mal an einem System sitze werden ich das nachholen, selbst nicht getesteten Code zu posten mache ich nicht so gerne. Des weiteren Funktionieren die Methoden auch nicht mit allen Monitor-Typen, nur mit mit denen die das auch in Ihren Capabilities supporten und dem System mitteilen.
Danke, schönes Wochenende und gute Gesundheit!
DitoGrüße Uwe
# hide powershell console window
Add-Type –MemberDefinition '
[DllImport("user32.dll")]public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")] public static extern bool SetForegroundWindow (IntPtr hWnd);
' -name Window -namespace W32
[void][W32.Window]::ShowWindow((Get-Process -id $pid).MainWindowHandle, 0)
# get current brightness level
$startLevel = (gwmi -Namespace root\WMI -Class WMiMonitorBrightness).CurrentBrightness
# set new brightness level to 100%
(gwmi -Namespace root\WMI -Class WMiMonitorBrightnessMethods).WMISetBrightness(1,100)
# start app and run in PresenationMode
$ppt = "D:\Test.pptx"
$app = New-Object -ComObject powerpoint.application
$pres = $app.Presentations.open($ppt)
$pres.SlideShowSettings.ShowType = 1
$ss = $pres.SlideShowSettings.Run()
# get process and set slideshow window to foreground
$ps = Get-Process -Name POWERPNT -EA SilentlyContinue
if ($ps.MainWindowHandle){
[void][w32.window]::SetForegroundWindow($ps.MainWindowHandle)
}
# wait until slideshow finished
while ($pres.SlideShowWindow){sleep 1}
# close pp process
$ps | stop-process
# release com ressources
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($app)
# restore to old brightness
(gwmi -Namespace root\WMI -Class WMiMonitorBrightnessMethods).WMISetBrightness(1,$startLevel)
Klappt hier im Test auf einem Windows 10/11 mit Office 2022 einwandfrei. Wenn man von Anfang an wüsste was du im ganzen machen willst müssten wir hier kein tröpfchenweises Stückwerk veranstalten.
Enumwerte siehe
https://docs.microsoft.com/de-de/office/vba/api/powerpoint.ppslideshowty ...
Was jetzt noch fehlt: Beim Aufruf von PPT zappeln in der Taskleiste eine Instanz mit der Formatauswahl in PPT und eine mit der tatsächlichen Show.
?? Welche Powerpoint Version, welches zappelndes Formatauswahl Fenster? Bild? Erleuchte mich.Kann man die Show irgend wie maximiert anzeigen?
Ja, entweder schon vorher in der Präsentations-Settings der Präsentation festlegen oder die Property in den SlideShowSettings setzen. ppShowTypeSpeaker (1) ist automatisch Vollbild, alternativ auch ppShowTypeKiosk (3) wo dann man dann nur mit ESC rauskommt und die Präsentation vollautomatisch nach den hinterlegten Zeiten abläuft.$pres.SlideShowSettings.ShowType = 1
https://docs.microsoft.com/de-de/office/vba/api/powerpoint.ppslideshowty ...
Wenn ich dann (die als Schleife laufende) Show beende, klappt alles weitere bestens. Al letztes habe ich noch ein exit ins PS gepackt.
Überflüssig, das macht die Konsole am Ende eh von selbst.Kein Auswahlfenster für Vorlage "Leere Präsentation, Holzart, usw.
Wenn mir die Fehlermeldungen aber genau so begegnen, bleibt mir nichts anderes.
VBA-Referenz für PowerPointViel Erfolg.
Grüße Uwe
Zitat von @spinnifex:
#ref VBA-Referenz: VBA hilft nichts bei Programmen außerhalb der Office-Familie.
Hier war von "Powerpoint" die Rede, und da wir hier das COM-Interface von Powerpoint nutzen gilt die obige Referenz natürlich auch für die nutzen von Powerpoint-Objekten in der Powershell, beide greifen auf die selbe Basis zurück, deswegen hilft diese hier selbstverständlich auch wenn nicht explizit Powershell drüber steht . Ein Blick da rein lohnt also wenn etwas bezüglich Powerpoint.Automation unklar ist.#ref VBA-Referenz: VBA hilft nichts bei Programmen außerhalb der Office-Familie.
Im nächsten Schritt geht es schließlich z.B. auch noch um Bildbearbeitung.
Eh ganz anderes Thema, und hellseherische Fähigkeiten stehen noch auf meiner ToDo-Liste .