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