from_point 函数不会在 windows CMD 上返回预期的控件

问题描述

我有以下代码

from pywinauto import Desktop
from pyautogui import position

while True:
    desktop = Desktop(backend="uia")
    control = desktop.from_point(*position())
    control.draw_outline()

因此在每个代码循环中,pywinauto 在当前鼠标位置的控件上绘制一个绿色矩形。像这样:

from_point

但是,仅在 CMD 应用程序上,from_point 函数找不到状态栏和滚动条。它只找到文本区域。

enter image description here

我认为这与 CMD 应用程序有关,可能是它在所有其他控件之前绘制了文本区域控件。所以我想知道是否可以使用函数 top_from_point 和/或 parent 来克服这种情况。值得一提的是,我还没有发现任何其他应用程序具有相同的行为,但可能其他一些应用程序也存在此问题。

解决方法

  • 可以使用“Inspect.exe”重现此行为: 如果您将鼠标光标悬停在 Windows CMD 上,它只会找到“文本区域”控件。要找到其他控件,您必须单击检查 GUI 中的树。

  • 对于 Pywinauto,情况相同: 如果您将鼠标光标悬停在 Windows CMD 上,它只会找到“文本区域”控件。 要找到其他控件,您必须执行以下代码: 打印(control.top_level_parent().descendants())

from_point 的实现在 uia_element_info.py:

@classmethod
def from_point(cls,x,y):
    return cls(IUIA().iuia.ElementFromPoint(tagPOINT(x,y)))

它使用来自 UIAutomationCore.dll 的 MS UI 自动化 API 函数

所以我认为这可能是 iuia.ElementFromPoint 的问题。