Windows 10 IVirtualDesktopManager :: MoveWindowToDesktop

Nop*_*opt 5 virtual-desktop windows-10

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

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

遗憾的是,“以管理员身份启动”还不够。我是否错过了COM接口我不知道的东西,还是设计不好?

Sha*_*ver 5

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

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

代码参考:

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