commit ca59d41f4b5724281e8c1206dd4ce53166e841cf Author: Andre <200930841+Andre-Bzk@users.noreply.github.com> Date: Sat Apr 25 17:21:18 2026 +0200 initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..22d7563 --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +# SunshineDisplaySwitch + +Löst ein Problem beim Game-Streaming mit **Sunshine + Moonlight**: Der physische PC-Monitor soll während des Streams deaktiviert sein und danach zuverlässig wieder aktiviert werden. + +## Hintergrund + +Sunshine läuft als Windows-Dienst (Session 0 / SYSTEM-Kontext). `DisplaySwitch.exe /internal` hat aus diesem Kontext zwar keinen Fehler geworfen, aber keinen Effekt gehabt — das Reaktivieren eines deaktivierten Monitors erfordert die interaktive Benutzersession. Die Lösung nutzt den Task Scheduler mit `InteractiveToken`, um den Befehl garantiert in der richtigen Session auszuführen. + +## Dateien + +| Datei | Zweck | +|---|---| +| `register_task.bat` | Einmalige Einrichtung — registriert den Scheduled Task | +| `idd_an.bat` | Sunshine Preparation Command — schaltet auf virtuellen Monitor um | +| `idd_aus.bat` | Sunshine Teardown Command — reaktiviert den physischen Monitor | + +## Einrichtung + +### 1. Task registrieren (einmalig) + +`register_task.bat` per Doppelklick ausführen und den UAC-Dialog bestätigen. Der Task `MoonlightTeardown` wird in der Windows-Aufgabenplanung registriert. + +Zur Kontrolle: +``` +schtasks /query /tn MoonlightTeardown /fo list +``` + +### 2. Sunshine konfigurieren + +In der Sunshine Web-UI unter **Configuration > General**: + +| Feld | Wert | +|---|---| +| Command Preparations — Do | Pfad zu `idd_an.bat` | +| Command Preparations — Undo | Pfad zu `idd_aus.bat` | + +## Funktionsweise + +``` +Stream startet + └─> idd_an.bat + └─> DisplaySwitch.exe /external (virtuellen Monitor aktivieren) + +Stream endet + └─> idd_aus.bat [läuft in Session 0] + └─> Start-ScheduledTask 'MoonlightTeardown' + └─> Task Scheduler [InteractiveToken = Benutzersession] + └─> DisplaySwitch.exe /internal (physischen Monitor reaktivieren) +``` + +## Voraussetzungen + +- Windows 10/11 +- [Sunshine](https://github.com/LizardByte/Sunshine) als Streaming-Server +- Kein zusätzliches Tool erforderlich — nur Windows-Bordmittel diff --git a/idd_an.bat b/idd_an.bat new file mode 100644 index 0000000..c85f087 --- /dev/null +++ b/idd_an.bat @@ -0,0 +1,2 @@ +DisplaySwitch.exe /external +timeout /t 2 \ No newline at end of file diff --git a/idd_aus.bat b/idd_aus.bat new file mode 100644 index 0000000..5c70341 --- /dev/null +++ b/idd_aus.bat @@ -0,0 +1,4 @@ +@echo off +REM Sunshine laeuft in Session 0 — DisplaySwitch muss in der User-Session laufen. +REM Task Scheduler startet es mit InteractiveToken in der richtigen Session. +powershell.exe -NonInteractive -Command "Start-ScheduledTask -TaskName 'MoonlightTeardown'" diff --git a/register_task.bat b/register_task.bat new file mode 100644 index 0000000..4f00d63 --- /dev/null +++ b/register_task.bat @@ -0,0 +1,16 @@ +@echo off +REM Selbst-Elevation: fordert Admin-Rechte via UAC-Dialog an +net session >nul 2>&1 +if %errorLevel% neq 0 ( + powershell -Command "Start-Process '%~f0' -Verb RunAs" + exit /b +) + +REM Angemeldeten Benutzer ermitteln (nicht SYSTEM) +for /f "tokens=*" %%u in ('powershell -NoProfile -Command "(Get-WMIObject Win32_ComputerSystem).Username"') do set CURRENT_USER=%%u + +powershell.exe -ExecutionPolicy Bypass -NonInteractive -Command "$action = New-ScheduledTaskAction -Execute 'DisplaySwitch.exe' -Argument '/internal'; $principal = New-ScheduledTaskPrincipal -UserId '%CURRENT_USER%' -LogonType Interactive -RunLevel Highest; $settings = New-ScheduledTaskSettingsSet -MultipleInstances IgnoreNew -ExecutionTimeLimit (New-TimeSpan -Minutes 1); Register-ScheduledTask -TaskName 'MoonlightTeardown' -Action $action -Principal $principal -Settings $settings -Force; Write-Host 'Task MoonlightTeardown erfolgreich registriert.'" + +echo. +echo Fertig. Dieses Fenster kann geschlossen werden. +pause