问题描述
from pywinauto import Desktop
from pyautogui import position
while True:
desktop = Desktop(backend="uia")
control = desktop.from_point(*position())
control.draw_outline()
因此在每个代码循环中,pywinauto 在当前鼠标位置的控件上绘制一个绿色矩形。像这样:
但是,仅在 CMD 应用程序上,from_point
函数找不到状态栏和滚动条。它只找到文本区域。
我认为这与 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 的问题。