5

关于 Windows 10 及其新的虚拟桌面功能,有没有办法确定特定窗口属于哪个虚拟桌面?而且,哪个虚拟桌面处于活动状态?

可以使用Snipping Tool看到问题。打开工具并选择一个New / Window Snip。当您移动鼠标时,截图工具会突出显示没有窗口的区域,但在另一个虚拟桌面上的该位置有一个窗口。

在这张图片中,截图工具突出显示了一个空白点。

截图工具不知道特定窗口在哪个虚拟桌面上。

这是 MSDN 论坛上的相同问题,没有答案,但有很多额外的细节。

抱歉,我的状态不够高,无法插入图片或包含更多链接。

4

1 回答 1

4

Windows SDK 支持团队博客发布了一个C # 演示以通过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);
            }
        }
    }

调用GetWindowDesktopId以获取桌面 GUID。

于 2015-09-11T15:38:36.017 回答