mirror of
https://github.com/Andre-Bzk/SunshineDisplaySwitch.git
synced 2026-11-15 09:33:11 +01:00
initial commit
This commit is contained in:
@@ -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
|
||||
@@ -0,0 +1,2 @@
|
||||
DisplaySwitch.exe /external
|
||||
timeout /t 2
|
||||
@@ -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'"
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user