funktioniert denn dein SetThreadDesktop? Wenn auf dem neuen Desktop kein Prozess geöffnet wird so wird der Desktop durch CloseDesktop wieder geschlossen.
Und prüfst du irgendwo ob GetDesktopWindow dir ein gültiges
Handle zurück gibt? Du solltest eine Fehlerbehandlung einbauen damit du an den verschiedensten stellen auch mitbekommst wenn ein Befehl fehlschläft. ansonsten ist es ein wildes Raten wo der Fehler steckt.