How to move a window between desktops using powershell/.net on windows 10
The Windows SDK Support Team Blog posted a C# demo to switch Desktops via IVirtualDesktopManager:
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("a5cd92ff-29be-454c-8d04-d82879fb3f1b")][System.Security.SuppressUnmanagedCodeSecurity]public interface IVirtualDesktopManager{[PreserveSig]int IsWindowOnCurrentVirtualDesktop( [In] IntPtr TopLevelWindow, [Out] out int OnCurrentDesktop );[PreserveSig]int GetWindowDesktopId( [In] IntPtr TopLevelWindow, [Out] out Guid CurrentDesktop );[PreserveSig]int MoveWindowToDesktop( [In] IntPtr TopLevelWindow, [MarshalAs(UnmanagedType.LPStruct)] [In]Guid CurrentDesktop );}[ComImport, Guid("aa509086-5ca9-4c25-8f95-589d3c07b48a")]public class CVirtualDesktopManager{}public class VirtualDesktopManager{ public VirtualDesktopManager() { cmanager = new CVirtualDesktopManager(); manager = (IVirtualDesktopManager)cmanager; } ~VirtualDesktopManager() { manager = null; cmanager = null; } private CVirtualDesktopManager cmanager = null; private IVirtualDesktopManager manager; public bool IsWindowOnCurrentVirtualDesktop(IntPtr TopLevelWindow) { int result; int hr; if ((hr = manager.IsWindowOnCurrentVirtualDesktop(TopLevelWindow, out result)) != 0) { Marshal.ThrowExceptionForHR(hr); } return result != 0; } public Guid GetWindowDesktopId(IntPtr TopLevelWindow) { Guid result; int hr; if ((hr = manager.GetWindowDesktopId(TopLevelWindow, out result)) != 0) { Marshal.ThrowExceptionForHR(hr); } return result; } public void MoveWindowToDesktop(IntPtr TopLevelWindow, Guid CurrentDesktop) { int hr; if ((hr = manager.MoveWindowToDesktop(TopLevelWindow, CurrentDesktop)) != 0) { Marshal.ThrowExceptionForHR(hr); } }}
Call GetWindowDesktopId
to get the Desktop GUID and later call MoveWindowToDesktop
with the GUID and a handle to your Window to move it t the vitual desktop.