9

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

在我自己的窗口上使用它效果很好,但不幸的是,当我尝试在另一个进程的窗口上使用它时,它会因 E_ACCESSDENIED 而失败。

可悲的是,“以管理员身份启动”还不够好。我是否遗漏了一些我不知道的关于 COM 接口的东西,或者它只是设计不当?

4

1 回答 1

10

您可以移动不属于执行进程的窗口,但它需要使用其他未记录的 COM 对象。

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

代码参考:

  • VirtualDesktopAccessor将相关对象包装在 C++ 中并构建您可以使用的本机 DLL。
  • VirtualDesktop将它们包装在 C# 中并提供 .NET DLL 和 GUI。
  • zVirtualDesktop记录了不同版本的界面。
  • 本论坛主题展示了如何使用 IVirtualDesktopManagerInternal 在 AutoHotKey 中按索引选择虚拟桌面。我正在开发一个包含 IApplicationViewCollection 以支持移动任何给定窗口的版本,如上所述。
于 2019-04-05T20:24:45.213 回答