Windows 10 IVirtualDesktopManager::MoveWindowToDesktop
Windows 10 IVirtualDesktopManager::MoveWindowToDesktop
我一直在尝试使用 IVirtualDesktopManager::MoveWindowToDesktop 在虚拟桌面之间移动 windows。
我自己使用它 windows 效果很好,但不幸的是,当我尝试在另一个进程的 window 上使用它时,它失败了 E_ACCESSDENIED。
遗憾的是 "Launch as admin" 不够好。
我是否遗漏了一些我不了解 COM 接口的东西,或者它只是设计得很糟糕?
您可以移动不属于执行进程的 window,但它需要使用额外的、未记录的 COM 对象。
- 在 ImmersiveShell 中查询 IApplicationViewCollection 和 IVirtualDesktopManagerInternal 的实例。
- 获取您要移动的 window 的 hwnd。
- 听起来您已经知道目标桌面 ID,但您也可以使用 IVirtualDesktopManagerInternal 方法 GetAdjacentDesktop 和 GetDesktops 来查找更多信息。
- 调用 IApplicationViewCollection::GetViewForHwnd 获取视图。
- 调用 IVirtualDesktopManagerInternal::MoveViewToDesktop 移动视图。
代码参考:
- VirtualDesktopAccessor 用 C++ 包装相关对象并构建一个您可以使用的本机 DLL。
- VirtualDesktop 将它们包装在 C# 中并提供 .NET DLL 和 GUI。
- zVirtualDesktop 记录不同版本的接口。
- This forum topic 展示了如何使用 IVirtualDesktopManagerInternal 通过 AutoHotKey 中的索引 select 虚拟桌面。我正在开发一个还包装 IApplicationViewCollection 的版本,以支持如上所述移动任何给定的 window。
我一直在尝试使用 IVirtualDesktopManager::MoveWindowToDesktop 在虚拟桌面之间移动 windows。
我自己使用它 windows 效果很好,但不幸的是,当我尝试在另一个进程的 window 上使用它时,它失败了 E_ACCESSDENIED。
遗憾的是 "Launch as admin" 不够好。 我是否遗漏了一些我不了解 COM 接口的东西,或者它只是设计得很糟糕?
您可以移动不属于执行进程的 window,但它需要使用额外的、未记录的 COM 对象。
- 在 ImmersiveShell 中查询 IApplicationViewCollection 和 IVirtualDesktopManagerInternal 的实例。
- 获取您要移动的 window 的 hwnd。
- 听起来您已经知道目标桌面 ID,但您也可以使用 IVirtualDesktopManagerInternal 方法 GetAdjacentDesktop 和 GetDesktops 来查找更多信息。
- 调用 IApplicationViewCollection::GetViewForHwnd 获取视图。
- 调用 IVirtualDesktopManagerInternal::MoveViewToDesktop 移动视图。
代码参考:
- VirtualDesktopAccessor 用 C++ 包装相关对象并构建一个您可以使用的本机 DLL。
- VirtualDesktop 将它们包装在 C# 中并提供 .NET DLL 和 GUI。
- zVirtualDesktop 记录不同版本的接口。
- This forum topic 展示了如何使用 IVirtualDesktopManagerInternal 通过 AutoHotKey 中的索引 select 虚拟桌面。我正在开发一个还包装 IApplicationViewCollection 的版本,以支持如上所述移动任何给定的 window。