windows-10 - Windows 10 IVirtualDesktopManager::MoveWindowToDesktop

标签 windows-10 virtual-desktop

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

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

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

最佳答案

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

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

  • 代码引用:
  • VirtualDesktopAccessor在 C++ 中包装相关对象并构建您可以使用的 native DLL。
  • VirtualDesktop将它们包装在 C# 中并提供 .NET DLL 和 GUI。
  • zVirtualDesktop记录不同版本的接口(interface)。
  • This forum topic展示了如何使用 IVirtualDesktopManagerInternal 在 AutoHotKey 中按索引选择虚拟桌面。我正在开发一个包含 IApplicationViewCollection 以支持移动任何给定窗口的版本,如上所述。
  • 关于windows-10 - Windows 10 IVirtualDesktopManager::MoveWindowToDesktop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32659505/

    相关文章:

    c# - win api 和 c# - 桌面

    windows - 在Windows 10中,我们如何判断一个窗口属于哪个虚拟桌面呢?

    c# - `PrintQueue.AddJob` 没有完成

    c - 通过断点续传上传请求的 google Drive 失败,返回错误代码 12156。如果有人知道这一点,请回复?

    Npm 安装使 Windows 崩溃

    azure - Microsoft Azure AD Connect 配置代理错误 5

    linux - 如何在 Linux 上获取虚拟桌面名称/编号?

    c# - 如何使用 Windows 10 BLE API 宣传 Eddystone URL 框架

    visual-studio - 使用CMake构建LLVM错误: NMake Makefiles does not support toolset specification

    azure - 创建 Azure 虚拟桌面 session 主机后,但用户无法访问远程桌面