Windows 10 IVirtualDesktopManager::MoveWindowToDesktop

Windows 10 IVirtualDesktopManager::MoveWindowToDesktop

我一直在尝试使用 IVirtualDesktopManager::MoveWindowToDesktop 在虚拟桌面之间移动 windows。

我自己使用它 windows 效果很好,但不幸的是,当我尝试在另一个进程的 window 上使用它时,它失败了 E_ACCESSDENIED。

遗憾的是 "Launch as admin" 不够好。 我是否遗漏了一些我不了解 COM 接口的东西,或者它只是设计得很糟糕?

您可以移动不属于执行进程的 window,但它需要使用额外的、未记录的 COM 对象。

  1. 在 ImmersiveShell 中查询 IApplicationViewCollection 和 IVirtualDesktopManagerInternal 的实例。
  2. 获取您要移动的 window 的 hwnd。
  3. 听起来您已经知道目标桌面 ID,但您也可以使用 IVirtualDesktopManagerInternal 方法 GetAdjacentDesktop 和 GetDesktops 来查找更多信息。
  4. 调用 IApplicationViewCollection::GetViewForHwnd 获取视图。
  5. 调用 IVirtualDesktopManagerInternal::MoveViewToDesktop 移动视图。

代码参考:

  • VirtualDesktopAccessor 用 C++ 包装相关对象并构建一个您可以使用的本机 DLL。
  • VirtualDesktop 将它们包装在 C# 中并提供 .NET DLL 和 GUI。
  • zVirtualDesktop 记录不同版本的接口。
  • This forum topic 展示了如何使用 IVirtualDesktopManagerInternal 通过 AutoHotKey 中的索引 select 虚拟桌面。我正在开发一个还包装 IApplicationViewCollection 的版本,以支持如上所述移动任何给定的 window。