Virtuelle Desktops: Kleines Open-Source-Tool (PowerShell/C#) gegen den Wallpaper-Reset-Bug und vergessene Fenster-Zuordnungen nach Reboot

Eitelwolf

Newbie
Registriert
Okt. 2026
Beiträge
2
Hallo zusammen,

wer unter Windows 11 intensiv mit mehreren virtuellen Desktops (Win + Tab) arbeitet, kennt vermutlich zwei nervige Eigenheiten des Betriebssystems:

Erstens überschreibt Windows 11 nach einem Monitor-Standby, Explorer-Neustart oder Reboot immer wieder die Hintergrundbilder einzelner virtueller Desktops mit dem Wallpaper eines anderen Desktops. Technisch liegt das meistens daran, dass unter HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers ein verwaistes SlideshowSourceDirectoriesSet-Flag aktiv bleibt oder der interne COM-Zustand (IVirtualDesktopManagerInternal) der explorer.exe von den GUID-Einträgen unter VirtualDesktops\Desktops auseinanderläuft. Zweitens hält Windows die Zuordnung, welches Anwendungsfenster auf welchem virtuellen Desktop liegt (inklusive "Dieses Fenster auf allen Desktops anzeigen"), nur flüchtig im RAM. Nach einem Neustart landet alles wieder auf Desktop 1.

Da es dafür bisher keine schlanke Lösung ohne aufgeblähte Drittanbieter-Tools gab, habe ich mir ein kleines Open-Source-Utility in PowerShell und C# geschrieben und unter MIT-Lizenz auf GitHub gestellt:
https://github.com/Hoven2025/Win11-Desktop-Guard

Unter der Haube liest restore_wallpapers.ps1 das binäre VirtualDesktopIDs-Array aus der Registry, deaktiviert das fehlerhafte Slideshow-Flag und synchronisiert Namen sowie Wallpaper-Pfade sowohl in der Registry als auch live per COM über Markus Scholtes' VirtualDesktop-Wrapper (VirtualDesktop11-24H2.cs). Damit man seine Hintergrundbilder trotzdem weiterhin ganz normal ändern kann, prüft das Skript bei Abweichungen, ob das aktuelle Bild ein Duplikat von einem anderen Desktop ist (dann hat der Windows-Bug zugeschlagen und das ursprüngliche Bild wird wiederhergestellt) oder ob man auf einem einzelnen Desktop bewusst eine neue Bilddatei gewählt hat (dann wird der neue Pfad automatisch in die desktop_config.json übernommen).

Für die Fenster-Zuordnung fragt save_window_layout.ps1 über einen kleinen C#-Helper (DesktopGuard.cs via EnumWindows, GetWindowPlacement, IVirtualDesktopManager::GetWindowDesktopId sowie Shell.Application für offene Explorer-Ordnerpfade) alle fünf Minuten die offenen Top-Level-Fenster ab und sichert sie in einer window_layout.json. Nach dem Windows-Logon schiebt restore_window_layout.ps1 die laufenden Fenster anhand von Prozessname, Window-Class, Titel und Koordinaten wieder auf ihren angestammten virtuellen Desktop zurück.

Fremde Runtimes werden nicht benötigt (läuft mit dem vorinstallierten Windows PowerShell 5.1; die C#-Quellen im Ordner src/ lassen sich bei Bedarf auch direkt mit der bordeigenen .NET-4-csc.exe neu kompilieren). Die Einrichtung legt lediglich zwei Aufgaben in der Windows-Aufgabenplanung an, die sich per Uninstall-Skript jederzeit wieder entfernen lassen.

Falls jemand ein ähnliches Multi-Desktop-Setup nutzt, freue ich mich über Feedback oder Anregungen!
 
  • Gefällt mir
Reaktionen: Homoioteleuton und Spawn182
Danke für die Entwicklung und Veröffentlichung! Ich werde es in der Arbeit ausprobieren.
 
Das klingt alles sehr hilfreich, ich schließe mich dem Vorredner an und werde mir das Projekt mal anschauen. Danke.
 
Freut mich sehr, wenn es euch im Alltag weiterhilft! Falls euch beim Testen (gerade im Arbeitsumfeld mit mehreren Monitoren oder speziellen Programmen) noch irgendein Sonderfall auffällt, gebt hier oder auf GitHub gerne Bescheid, dann passe ich das Skript entsprechend an.
 
  • Gefällt mir
Reaktionen: Spawn182
Oktober 2026
Zurück
Oben