/// <summary>
        /// Creates a virtual desktop.
        /// </summary>
        public static VirtualDesktop Create()
        {
            VirtualDesktopHelper.ThrowIfNotSupported();

            var desktop = ComInternal.CreateDesktopW();
            var wrapper = wrappers.GetOrAdd(desktop.GetID(), _ => new VirtualDesktop(desktop));

            return(wrapper);
        }
        /// <summary>
        /// Remove the virtual desktop, specifying a virtual desktop that display after destroyed.
        /// </summary>
        public void Remove(VirtualDesktop fallbackDesktop)
        {
            if (fallbackDesktop == null)
            {
                throw new ArgumentNullException();
            }

            ComInternal.RemoveDesktop(this.ComObject, fallbackDesktop.ComObject);
        }
        internal static IEnumerable <VirtualDesktop> GetDesktopsInternal()
        {
            var desktops = ComInternal.GetDesktops();
            var count    = desktops.GetCount();

            for (var i = 0u; i < count; i++)
            {
                object ppvObject;
                desktops.GetAt(i, typeof(IVirtualDesktop).GUID, out ppvObject);

                var desktop = (IVirtualDesktop)ppvObject;
                var wrapper = wrappers.GetOrAdd(desktop.GetID(), _ => new VirtualDesktop(desktop));

                yield return(wrapper);
            }
        }
        /// <summary>
        /// Returns a virtual desktop on the right.
        /// </summary>
        public VirtualDesktop GetRight()
        {
            IVirtualDesktop desktop;

            try
            {
                desktop = ComInternal.GetAdjacentDesktop(this.ComObject, AdjacentDesktop.RightDirection);
            }
            catch (COMException ex)             //when (ex.Match(HResult.TYPE_E_OUTOFBOUNDS))
            {
                return(null);
            }
            var wrapper = wrappers.GetOrAdd(desktop.GetID(), _ => new VirtualDesktop(desktop));

            return(wrapper);
        }
        /// <summary>
        /// Returns the virtual desktop of the specified identifier.
        /// </summary>
        public static VirtualDesktop FromId(Guid desktopId)
        {
            VirtualDesktopHelper.ThrowIfNotSupported();

            IVirtualDesktop desktop;

            try
            {
                desktop = ComInternal.FindDesktop(desktopId);
            }
            catch (COMException ex)             //when (ex.Match(HResult.TYPE_E_ELEMENTNOTFOUND))
            {
                return(null);
            }
            var wrapper = wrappers.GetOrAdd(desktop.GetID(), _ => new VirtualDesktop(desktop));

            return(wrapper);
        }
        /// <summary>
        /// Returns the virtual desktop that the specified window is located.
        /// </summary>
        public static VirtualDesktop FromHwnd(IntPtr hwnd)
        {
            VirtualDesktopHelper.ThrowIfNotSupported();

            if (hwnd == IntPtr.Zero)
            {
                return(null);
            }

            IVirtualDesktop desktop;

            try
            {
                var desktopId = ComManager.GetWindowDesktopId(hwnd);
                desktop = ComInternal.FindDesktop(desktopId);
            }
            catch (COMException ex)             //when (ex.Match(HResult.REGDB_E_CLASSNOTREG, HResult.TYPE_E_ELEMENTNOTFOUND))
            {
                return(null);
            }
            var wrapper = wrappers.GetOrAdd(desktop.GetID(), _ => new VirtualDesktop(desktop));

            return(wrapper);
        }
 /// <summary>
 /// Display the virtual desktop.
 /// </summary>
 public void Switch()
 {
     ComInternal.SwitchDesktop(this.ComObject);
 }