Windows 10 适用于Windows 10虚拟桌面的API

Windows 10 适用于Windows 10虚拟桌面的API,windows-10,virtual-desktop,Windows 10,Virtual Desktop,是否有任何方法可以从代码中枚举、切换、添加虚拟桌面以及在桌面之间移动窗口?最好是WinAPI。我担心Windows 10中所有关于“虚拟桌面”的内容都没有文档记录,但在一个俄文页面中,我看到了这些接口的文档记录。我不会说俄语,但他们似乎使用了逆向工程。无论如何,代码非常清晰(感谢他们!) 注意这里: 我一直在尝试看看旧API的CreateDesktop、OpenDesktop等是否。。。已链接到新的虚拟桌面,但无法 这些界面与Windows 10的最终生产版本(2015-05-08)配合使用,

是否有任何方法可以从代码中枚举、切换、添加虚拟桌面以及在桌面之间移动窗口?最好是WinAPI。

我担心Windows 10中所有关于“虚拟桌面”的内容都没有文档记录,但在一个俄文页面中,我看到了这些接口的文档记录。我不会说俄语,但他们似乎使用了逆向工程。无论如何,代码非常清晰(感谢他们!)

注意这里:

我一直在尝试看看旧API的CreateDesktop、OpenDesktop等是否。。。已链接到新的虚拟桌面,但无法

这些界面与Windows 10的最终生产版本(2015-05-08)配合使用,但在Microsoft记录之前,不应在真正广泛的分布式应用程序中使用它们。太多的风险

关于。

通过IVirtualDesktopManager发布的a:

[ComImport,InterfaceType(ComInterfaceType.InterfaceSiunknown),Guid(“a5cd92ff-29be-454c-8d04-d82879fb3f1b”)]
[System.Security.SuppressUnmanagedCodeSecurity]
公共接口IVirtualDesktopManager
{
[信号]
int IsWindowOnCurrentVirtualDesktop(
[在]IntPtr TopLevel窗口中,
[Out]Out int OnCurrentDesktop
);
[信号]
int GetWindowDesktopId(
[在]IntPtr TopLevel窗口中,
[输出]输出Guid当前桌面
);
[信号]
int MoveWindowToDesktop(
[在]IntPtr TopLevel窗口中,
[Marshallas(UnmanagedType.LPStruct)]
[In]Guid CurrentDesktop
);
}
[ComImport,Guid(“aa509086-5ca9-4c25-8f95-589d3c07b48a”)]
公共类CVirtualDesktopManager
{
}
公共类VirtualDesktopManager
{
公共VirtualDesktopManager()
{
cmanager=新的CVirtualDesktopManager();
经理=(IVirtualDesktopManager)cmanager;
}
~VirtualDesktopManager()
{
manager=null;
cmanager=null;
}
私有CVirtualDesktopManager cmanager=null;
私人IVirtualDesktopManager;
公共窗口OnCurrentVirtualDesktop(IntPtr TopLevelWindow)
{
int结果;
国际人力资源;
如果((hr=manager.IsWindowOnCurrentVirtualDesktop(TopLevelWindow,out结果))!=0)
{
元帅。通过hr(hr)的例外情况;
}
返回结果!=0;
}
公共Guid GetWindowDesktopId(IntPtr TopLevelWindow)
{
指导结果;
国际人力资源;
如果((hr=manager.GetWindowDesktopId(TopLevelWindow,out结果))!=0)
{
元帅。通过hr(hr)的例外情况;
}
返回结果;
}
public void MoveWindowToDesktop(IntPtr TopLevelWindow,Guid CurrentDesktop)
{
国际人力资源;
如果((hr=manager.MoveWindowToDesktop(TopLevelWindow,CurrentDesktop))!=0)
{
元帅。通过hr(hr)的例外情况;
}
}
}

它包括用于检测窗口显示在哪个桌面上的API,并且它可以在桌面上切换和移动窗口。

有一个人制作了一个应用程序来映射键盘shorcut以在虚拟桌面之间移动窗口。 (我每天都用)

他有一个博客,解释他做了什么 (你可以用谷歌翻译,它是日文的)

事实上,他在Alberto Tostado的回复中使用了相同的api。 api可以在他的github上找到

该api的使用非常简单,但似乎不可能将窗口从另一个进程移动

public static bool MoveToDesktop(IntPtr hWnd, VirtualDesktop virtualDesktop)
    {
        ThrowIfNotSupported();

        int processId;
        NativeMethods.GetWindowThreadProcessId(hWnd, out processId);

        if (Process.GetCurrentProcess().Id == processId)  // THAT LINE
        {
            var guid = virtualDesktop.Id;
            VirtualDesktop.ComManager.MoveWindowToDesktop(hWnd, ref guid);
            return true;
        }

        return false;
    }
为了解决这个问题,他们做了另一个实现,与俄罗斯博客中的实现一起使用

if (VirtualDesktopHelper.MoveToDesktop(hWnd, right) //<- the one in the russian blog
                    || this.helper.MoveWindowToDesktop(hWnd, right.Id)) <- the second implementation

if(VirtualDesktopHelper.MoveToDesktop(hWnd,right)//。是的,有一些关于接口的文档。但是如何在“普通”中使用它呢使用c#/xaml的UWP应用程序??你能举出一些例子吗?@okieh看我的答案。微软创建了一个c#demove。CLSID不再有效。我想做一些比移动窗口更简单的事情,只是切换桌面。我该怎么做?我对没有返回到以前的桌面键感到非常沮丧,这将是最重要的曾经有用的东西-由于缺少直接的桌面键-例如,像win-ctrl-1转到桌面1-所以我想写一个autoit脚本来制作这些键是的,这真的很容易实现!有一个项目:确实如此,但我建议您只自定义此项目中的代码()根据您的需要。它有一个更好的实现。@ycomp我制作了一个DLL,可以从AutoHotkey@ycomp访问。这是您喜欢的…有点让您想知道为什么Microsoft不直接为此添加键盘快捷键,不是吗…@totaam谢谢,Microsoft归档了大多数旧博客。我已经更新了归档的链接。