在多个 windows 10 个虚拟桌面上持久 window?

Persistent window across multiple windows 10 virtual desktops?

我有多个 windows 的 C# WPF 程序。我添加了对 windows 10 个桌面的支持,但用户希望在桌面之间移动时一些 windows 留在屏幕上。

例如,如果 window A 在第一个桌面上打开,然后他们翻到第二个桌面,他们希望 window A 留在新桌面上的相同位置。

我知道的唯一功能来自 VirtualDesktopManager:

GetWindowsDesktopId()
IsWindowOnCurrentVirtualDesktop()
MoveWindowToDesktop()

有办法吗?

还有,有没有办法检测桌面翻转何时启动?因为如果是这样,我总是可以调用 IsWindowOnCurrentVirtualDesktop(),如果答案是否定的,我可以调用 MoveWindowToDesktop() 将其放置在那里。似乎有点 hack,但如果我有检测桌面变化的方法就可以完成工作。

您可以检测到虚拟桌面的变化,找到了一个不错的 GitHub 项目,其中包含必要的代码以及更多处理虚拟桌面的功能 Windows 10。

Virtual Desktop GitHub

要获取事件并模拟 window 停留在每个桌面上,您可以执行以下操作。

VirtualDesktop.CurrentChanged += (o, e) =>
{
    this.Dispatcher.Invoke(() =>
    {
        var h = new WindowInteropHelper(this).Handle;

        if (!VirtualDesktopHelper.IsCurrentVirtualDesktop(h))
        {
            this.MoveToDesktop(VirtualDesktop.Current);
        }
    });
};

Dispatcher.Invoke 是必需的,因为事件与 UI 不同,所以调用必须编组到 UI 线程。