spinnifex
Goto Top

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:
(Get-WmiObject -Namespace root / WMI –Class WmiMonitorBrightnessMethods) .WmiSetBrightness (1, x)
wobei das x in der letzten Klammer für den Prozentsatz Helligkeit stehen soll.

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

Content-ID: 1774184509

Url: https://administrator.de/contentid/1774184509

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

Mystery-at-min
Mystery-at-min 29.01.2022 um 09:49:51 Uhr
Goto Top
Wie wäre es für etwas Raumhelligkeit zu Sorgen? Hilft auch den Augen.
colinardo
Lösung colinardo 29.01.2022 aktualisiert um 10:28:13 Uhr
Goto Top
Servus,
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)
Grüße Uwe
spinnifex
spinnifex 29.01.2022 um 10:37:16 Uhr
Goto Top
Moin Uwe!

vielen Dank für Dein Snippet! Ich habe es eben etwas modifiziert (notepad wurde mit/ohne .exe schonmal nicht gestartet, FF geht) ausprobiert und sehe leider genau keine Änderung der Helligkeit. Das Ausblenden des PS-Fensters habe ich zur Fehlerkontrolle auskommentiert. Um Windows die volle Kontrolle zu überlassen habe ich die Helligkeit am Monitor selbst auf 100% gesetzt.

Sieht jetzt so aus:
# 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) 

# set new brightness level to 35%
(gwmi -Namespace root\WMI -Class WMiMonitorBrightnessMethods).WMISetBrightness(1,35)

# get current brightness level
$startLevel = (gwmi -Namespace root\WMI -Class WMiMonitorBrightness).CurrentBrightness

# set new brightness level to 95%
(gwmi -Namespace root\WMI -Class WMiMonitorBrightnessMethods).WMISetBrightness(1,95)

# start app and wait until closed
start "firefox" -Wait  

# restore to old brightness
(gwmi -Namespace root\WMI -Class WMiMonitorBrightnessMethods).WMISetBrightness(1,$startLevel)

Der PC ist ein Laptop mit geschlossenem Display (Bildschirm 3), gesteuert werden soll der Desktop-Monitor (1|2).

Grüße Spinnifex
colinardo
colinardo 29.01.2022 aktualisiert um 10:51:46 Uhr
Goto Top
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.
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.
spinnifex
spinnifex 29.01.2022 um 11:02:20 Uhr
Goto Top
da musst du über die Win32 Methoden gehen.
Aua! Da tappse ich doch von einem Bömischen Dorf ins nächste. Hast Du mir einen Tipp für einen Einstieg, von dem ich lossuchen kann?

Vielen Dank!
colinardo
colinardo 29.01.2022 aktualisiert um 11:13:34 Uhr
Goto Top
spinnifex
spinnifex 29.01.2022 um 11:21:38 Uhr
Goto Top
Moin Uwe!

Nach Deinem Hinweis "nur am Laptop" habe ich Dein Skript eben auf meinem Surface ausprobiert. Da klappt das super! Vielen Dank!

Die Links oben bedeuten Lesearbeit. Bis ich die geschafft habe, sehe ich das Thema erst einmal als GELÖST.

Danke, schönes Wochenende und gute Gesundheit!

Spinnifex
colinardo
colinardo 29.01.2022 aktualisiert um 11:41:24 Uhr
Goto Top
👍
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!
Dito

Grüße Uwe
spinnifex
spinnifex 29.01.2022 um 12:30:34 Uhr
Goto Top
Moin noch mal,

mein -sorry Uwes (!)- Script tut auf dem Tablet jetzt fast was es soll:
# 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 = (gwmi -Namespace root\WMI -Class WMiMonitorBrightness).CurrentBrightness

# set new brightness level to 95%
(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)
          $app.visible = "msoTrue"  
          $pres.SlideShowSettings.Run()                         
          $pres.visible = "msoTrue"    

# restore to old brightness
(gwmi -Namespace root\WMI -Class WMiMonitorBrightnessMethods).WMISetBrightness(1,$startLevel)

Was vorher mit "Start / Wait" gut funktioniert hat, bekomme ich mit dem neuen Aufruf von PPT nicht hin. Also schaltet der Bildschirm wieder auf $startLevel, bevor PPT am Start ist. Das "Wait" habe ich in allen Zeilen des neuen Aufrufs erfolglos versucht. Ist für Profis sicher 'ne Kleinigkeit (schäm...)

Grüße
colinardo
colinardo 29.01.2022 aktualisiert um 13:03:40 Uhr
Goto Top
Bin gerade nicht am Rechner aber Zeile 19 mal das hier einfügen
while (Get-Process -Name powerpnt){sleep 2}
wartet dort so lange wie es einen Powerpoint Prozess gibt.
spinnifex
spinnifex 29.01.2022 aktualisiert um 13:23:05 Uhr
Goto Top
Bleibt leider im Wartezustand stehen, auch wenn der Prozess beendet ist face-plain

Mit Pause (das PS-Fenster bleibt ja bisher eingeblendet) funktionierts.
colinardo
colinardo 29.01.2022 aktualisiert um 13:24:34 Uhr
Goto Top
Dann läuft bei dir wohl noch eine andere PP Instanz parallel oder die COM Ressourcen hängen noch im Speicher, melde mich später nochmal wenn ich es testen kann.
spinnifex
spinnifex 29.01.2022 um 13:27:11 Uhr
Goto Top
Lass Dir Zeit, ich muss jetzt auch erst ppeinmal kurz kochen ...

Der Taskmanager zeigt weder als App noch als Dienst etwas von Powerpoint
colinardo
colinardo 29.01.2022 aktualisiert um 14:56:40 Uhr
Goto Top
# 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)
spinnifex
spinnifex 29.01.2022 um 14:45:06 Uhr
Goto Top
Mahlzeit!

Schritt für Schritt kommst Du der Sache näher, was micht davon abhält erst mal ein möglichst lautes DANKE von mir zu geben. Deine hervoragenden Kommentarzeilen ermöglichen es sogar mir, den Schritten immerhin mit etwas Verständnis zu folgen. face-smile face-smile

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. Kann man die Show irgend wie maximiert anzeigen?

Wenn ich dann (die als Schleife laufende) Show beende, klappt alles weitere bestens. Al letztes habe ich noch ein exit ins PS gepackt.

Grüße
spinnifex
spinnifex 29.01.2022 um 14:51:11 Uhr
Goto Top
einmal zum Test | out-Null aus- und wieder einkommentiert - und schon klappt's auch mit dem Max. strange
colinardo
colinardo 29.01.2022 aktualisiert um 15:03:09 Uhr
Goto Top
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.
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
Enumwerte siehe
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.
spinnifex
spinnifex 29.01.2022 aktualisiert um 15:52:34 Uhr
Goto Top
Sorry Uwe,

es war nicht meine Absicht hier mit Stückwert aufzutauchen / zu nerven. Wenn mir die Fehlermeldungen aber genau so begegnen, bleibt mir nichts anderes. Abschließend also nochmal den Komplettzusammenhang:

  • Office 2019 pro+
  • Bildschirmhelligkeit für die Dauer einer Endlos-Präsentation auf 100
  • PS Konsole unsichtbar
  • Kein Auswahlfenster für Vorlage "Leere Präsentation, Holzart, usw."
  • Show als Scheife (in PPT gesetzt)
  • Beenden der show mit Esc
  • Helligkeit auf vorherigen Wert

Entsprechend werde ich mit ppShowTypeKiosk (3) mein Glück versuchen und hoffe ohne Probleme durchzukommen. exit ist schon gestrichen.

Vielen, vielen Dank und noch mal Sorry!

Grüße und schönes Wochenende!
Spinnifex
colinardo
colinardo 29.01.2022 aktualisiert um 16:26:39 Uhr
Goto Top
Kein Auswahlfenster für Vorlage "Leere Präsentation, Holzart, usw.

screenshot

Wenn mir die Fehlermeldungen aber genau so begegnen, bleibt mir nichts anderes.
VBA-Referenz für PowerPoint

Viel Erfolg.

Grüße Uwe
spinnifex
spinnifex 01.02.2022 um 08:44:26 Uhr
Goto Top
Moin Uwe,

#ref screenshot: Nachdem in PP schon so einiges per PS direkt steuern ließ, hatte ich angenommen, dass es auch für den Startbildschirm einen Hack gibt. Die PP-Optionen sind mir durchaus vertraut.

#ref Fehlermeldungen: Das bezog sich sicher nicht auf PP, sondern auf PS.

#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.

Grüße
colinardo
colinardo 01.02.2022 aktualisiert um 11:18:14 Uhr
Goto Top
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 face-smile. Ein Blick da rein lohnt also wenn etwas bezüglich Powerpoint.Automation unklar ist.
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 face-wink.