如何找到窗口所在的(虚拟)桌面?

问题描述 投票:0回答:1

我在

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

这是我正在编写的应用程序中相当重要的部分,因此我愿意接受任何可能的解决方案。我假设如果这是可行的,功能将在

user32.dll
中的某个地方公开,但我愿意接受更多 hacky 方法。如果这只能通过内核驱动程序实现,那将是一件好事。

注意:“桌面”不是指“监视器”,这是不同的东西,请参阅Windows 中的多个桌面。搜索有关“Windows 桌面”的信息真的很难,因为 Google 确信我指的是“桌面”,并且拒绝考虑任何替代方案。

windows winapi user32
1个回答
1
投票

您所指的功能更正式地称为“虚拟桌面”。但是,它仅设计为 user-managed 功能,因此对其的应用程序支持非常有限:

虚拟桌面是最终用户窗口管理功能,而不是程序化功能

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

IVirtualDesktopManager接口的目的是让应用程序在少数应用场景中考虑虚拟桌面状态。

也就是说,

IVirtualDesktopManager
接口确实有一个
GetWindowDesktopId()
方法:

获取托管提供的顶级窗口的虚拟桌面的标识符。

几乎唯一official你可以用这个id做的事情是使用

IVirtualDesktopManager::MoveWindowToDesktop()
将其他窗口移动到同一个桌面:

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

如上文所述:

IVirtualDesktopManager 接口旨在涵盖的另一个场景是应用程序由多个一起运行的窗口组成,例如一个主窗口和一堆辅助窗口。虚拟桌面管理器已经识别出多种类型的辅助窗口,并自动将它们保持在与主窗口相同的虚拟桌面上。但是一个应用程序可能有一个不寻常的窗口结构,可以逃避这种自动检测。

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

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

因为关键是让你移动你的辅助窗口,所以它们跟随主窗口。它不是用于将窗口移动到任意虚拟桌面的通用接口。这是给用户做的。

也就是说,有一个 undocumented

IVirtualDesktopManagerInternal
接口可以执行更多操作,例如枚举虚拟桌面、创建/删除虚拟桌面、在虚拟桌面之间切换等,但是您应该避免使用该接口,除非您绝对需要它。

© www.soinside.com 2019 - 2024. All rights reserved.