Si bien la idea es simple, costo trabajo hacerlo
Basado en la clase cDesktop (ShellProt) de Cobein
PRUEBENLO COMPILADO, no del ide!
Lo que hace esto es lo siguiente: Comprueba que un mutex no exista. Si no existe, lo crea y se ejecuta a si mismo (pero en otro escritorio, uno virtual). Entonces si el mutex existe, significa que esta corriendo en el escritorio virtual. Si estas en el escritorio virtual, comprobar que otro mutex no exista. Si no existe, llama a un sub (MainVirtual) donde corre todo el programa en si. Si el mutex existe, significa que ya se esta ejecutando una instancia, y sobre el escritorio virtual.
linken: bajalo
PD: no pongo screenshots dado que no serian para nada informativas.
Edit:
PD2: una cosa a tener en cuenta, si el programa (ejecutado en el desktop virtual) crashea, no pasa nada. el escritorio vuelve al original ya que es otro exe el que esta esperando que se cierre el .exe en el desktop virtual.
saludos!