代码之家  ›  专栏  ›  技术社区  ›  yeerk

如何查找窗口所在的(虚拟)桌面(Windows)

  •  0
  • yeerk  · 技术社区  · 3 年前

    我在上使用多个桌面 Windows ,并且我正在尝试确定窗口所在的桌面。我可以使用检索窗口的位置 GetWindowRect (来自 user32.dll ),但这并不能告诉我窗口在哪个桌面上( Desktop 1 , Desktop 2 等)。

    这是我正在编写的应用程序中相当重要的一部分,所以我对任何可能的解决方案都持开放态度。我认为如果这是可行的,该功能将在 user32.dll ,但我对更狡猾的方法持开放态度。如果这只能通过内核驱动程序实现,那么很高兴知道这一点。

    注释 :我所说的“桌面”不是指“显示器”,这是另一回事,看 Multiple desktops in Windows 。在“windows桌面”上搜索信息真的很难,因为谷歌确信我指的是“桌面”,并拒绝考虑任何替代方案。

    1 回复  |  直到 3 年前
        1
  •  1
  •   Remy Lebeau    3 年前

    您所指的功能更正式地称为“虚拟桌面”。然而,它被设计为 用户管理的 功能,因此应用程序对其的支持非常有限:

    Virtual desktops are an end-user window management feature, not a programmatic one

    虚拟桌面是一种窗口管理功能,而不是安全功能或性能功能。此外,它们是供最终用户组织窗口的,而不是供其他程序组织窗口的。

    IVirtualDesktopManager接口的目的是允许应用程序在少数应用程序场景中考虑虚拟机状态。

    也就是说 IVirtualDesktopManager 接口确实有 GetWindowDesktopId() 方法:

    获取承载所提供的顶级窗口的虚拟机的标识符。

    几乎是唯一的 公务的 使用该id可以将其他窗口移动到同一桌面,方法是使用 IVirtualDesktopManager::MoveWindowToDesktop() :

    将窗口移动到指定的虚拟机。

    如上述文章所述:

    IVirtualDesktopManager界面旨在涵盖的另一个场景是由多个共同操作的窗口组成的应用程序,如主窗口和一堆辅助窗口。虚拟机管理器已经识别出许多类型的辅助窗口,并自动将它们与主窗口保持在同一虚拟机上。但是应用程序可能具有不寻常的窗口结构,无法进行这种自动检测。

    对于这些情况,您可以为主窗口调用IVirtualDesktopManager::GetWindowDesktopId以获取其当前虚拟机的ID,然后使用IVirtual DesktopManager:MoveWindowsToDesktop将辅助窗口移动到同一虚拟机。

    MoveWindowsToDesktop的目的特别是不让程序抓取所有用户窗口并将其分散在所有虚拟桌面上。例如,请注意,您唯一能做的就是使一个窗口加入另一个窗口虚拟桌面。你可以把窗口放在一起,但不能把一个窗口拆分成一个新的虚拟桌面。

    因为重点是让你移动辅助窗口,使它们跟随主窗口。它不是用于将窗口移动到任意虚拟桌面上的通用接口。这是由用户来做的。

    话虽如此,有一个 无证件的 IVirtualDesktopManagerInternal 可以执行更多操作的接口,如枚举虚拟机、创建/删除虚拟机、在虚拟机之间切换等,但除非绝对需要,否则应避免使用该接口。

    推荐文章