如何获取甚至未使用 EnumWindows() API 列出的窗口?

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

EnumWindows() API 用于对当前运行系统中的所有窗口执行特定操作。 然而,即使“窗口”明显存在,也存在无法确认“那个”窗口信息的情况。

例如,按键盘上的“Windows 键”出现的“开始”菜单窗口、按“Windows 键”+“G”出现的游戏管理器窗口或 Windows 10 或更高版本中的闹钟菜单窗口。

这些窗口是用户可以直观看到的窗口,并且已知与实际应用程序窗口是相同的窗口。

但是,这些窗口似乎不能被我正在使用的简单的 EnumWindows() API 识别,也不能被其他函数识别。

此外,我知道这些窗口的“Band”与默认应用程序不同,具体取决于 Windows 8 或更高版本中添加的窗口“Band”。

但是,我不知道这些窗口是否无法检查只是因为它们的“Band”顺序高于常规应用程序。

因为我创建的另一个 Windows 测试工具的 UI_ACCESS 属性具有比默认应用程序更高的 z 顺序带,所以我能够使用简单的 API(如 EnumWindows())访问该窗口。

因此,我不认为问题在于有些窗口我无法访问(或未列出),因为窗口“Band”值不同。

您对控制这些“隐藏”窗口有什么好主意吗?

我想列出或控制系统上所有打开的 Windows 窗口。除了基本API返回的窗口之外,似乎还有一个隐藏的窗口。我不知道如何接近他们。

windows winapi windows-kernel
1个回答
0
投票

EnumWindows 为每个top-level窗口调用回调函数。

它不会迭代子窗口(有某些例外)。文档对于拥有的窗口是否是顶级窗口可能不明确。

菜单(甚至可能是“开始”菜单)通常被实现为弹出窗口,它通常是一个拥有的窗口。

EnumWindows 枚举当前存在的窗口。某些弹出窗口在不需要时会保持隐藏状态。其他的在不需要时被销毁,如果以后再次需要它们可以被重新创建。因此,您可能看不到窗口,因为在您的程序枚举它们时它并不存在。

Windows 具有“完整性级别”,可防止完整性较低的进程向完整性较高的窗口发送消息。这不应该影响窗口的枚举,但可能会影响“控制”它们。

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