Pywinauto:如何调整活动窗口的大小

Posted

技术标签:

【中文标题】Pywinauto:如何调整活动窗口的大小【英文标题】:Pywinauto: How to resize active window 【发布时间】:2021-12-24 19:45:02 【问题描述】:

我正在尝试自动化一些 Windows 任务,我得到了所有打开的窗口的数据框,然后我添加了一些列以便在继续自动化之前进行一些验证。

set_focus() 函数激活窗口后,我根本无法调整任何窗口的大小,只是什么都没有发生。

我已经尝试过使用win32gui 解决方案:

current = win32gui.GetForegroundWindow()
win32gui.MoveWindow(current, 0, 0, 100, 100, True)

我也尝试将pygetwindow 函数用于resizeTosize,但也没有任何反应。

如果我运行以下命令app.move_window(x=None, y=None, width=100, height=100, repaint=True)AttributeError: 'UIAWrapper' object has no attribute 'move_window'

我的代码:

from pywinauto import Desktop
import pandas as pd

windows = Desktop(backend="uia").windows()
window = [w.window_text() for w in windows]

# Create a dataframe in order to store the windows needed
df_windows = pd.DataFrame(window, columns =['WebBrowser'])
# Filter dataframe only to show all windows from Brave web browser
df_windows = df_windows.loc[df_windows['WebBrowser'].str.contains("Brave:", case=False)]
# Add column profile from Brave
df_windows['Profile'] = df_windows['WebBrowser'].str.split(':').str[1].str.strip()
# Add column window open from Brave
df_windows['Window'] = df_windows['WebBrowser'].str.split(':').str[0].str.strip()
# Add column about the website open from Brave
df_windows['Website'] = df_windows['Window'].str.replace(" - Brave", "").str.strip()
# Filter dataframe only to show all bombcrypto game window
df_windows = df_windows.loc[df_windows['Website'] == 'GuilhermeMatheus']

print(df_windows)

for x in df_windows['WebBrowser']:
    print(x)
    app = Desktop(backend="uia").windows(title=x)[0]
    app.set_focus()
    app.move_window(x=None, y=None, width=100, height=100, repaint=True)

set_focus() 之后如何调整活动窗口的大小?

[编辑]

按照@Vasily Ryabov 的提示,我下载了Windows SDK 以安装具有Inspect.exe 的功能,还遵循pywinauto 的文档Getting Start 主题和Accessibility tools - Inspect 提供的文档我是能够通过 Inspect 找到我的应用程序,Resize 选项可作为以下证据:

所以我尝试了以下命令: 1º:

app.iface_transform.Resize(200, 600)  

错误:

app.iface_transform.Resize(200, 600)
_ctypes.COMError: (-2146233079, None, (None, None, None, 0, None))

2º:

app.Resize(200, 600)  

错误:

AttributeError: 'UIAWrapper' object has no attribute 'Resize'

3º:

app.wrapper_object.Resize(200, 600)  

错误:AttributeError: 'UIAWrapper' object has no attribute 'wrapper_object'

【问题讨论】:

【参考方案1】:

我建议为 UIAWrapper 对象尝试这些方法(假设 appUIAWrapper 实例)。在您的代码中,它应该如下所示:

app.iface_transform.Move(x, y)
app.iface_transform.Resize(width, height)

要了解此 TransformPattern 是否可用,让我们在所选窗口的“操作”菜单中使用 Inspect.exe 检查它:

在下一个主要版本(尚未发布)中,我们实现了包含方法 move_window 的 WindowWrapper,该方法使用上述 TrasformPattern 方法。

【讨论】:

嗨@Vasily,感谢您的回答和解释。我仍然面临错误:AttributeError: 'UIAWrapper' object has no attribute 'wrapper_object' 哦,抱歉,请跳过链中的.wrapper_object() 调用。此外,如果应用程序端未实现转换模式,您将收到异常NoPatternInterfaceError 我真的不知道我仍然遇到的问题是什么:app.iface_transform.Resize(300, 300) _ctypes.COMError: (-2146233079, None, (None, None, None, 0, None))。抱歉打扰了,你能帮帮我吗?如果我理解正确,我的应用程序是 UIAWrapper,因为我通过从 app = Desktop(backend="uia").windows(title=x)[0] 调用从数据框再次创建(set_focus() 甚至可以工作) 也许你只需要Resize。它适用于其他***窗口吗?我的意思是方法.windows() 返回的列表项。如果未提供参数,它将返回所有***窗口。此外,我建议检查 Inspect.exe “操作”菜单项是否适用于此窗口和其他窗口。 我尝试从github.com/pywinauto/py_inspect 运行Inspect.exe,但我没有选项栏窗格,所以我看不到Actions。我还尝试了.windows() 的列表项,如果我尝试app.iface_transform.Resize(width, height),我会收到错误NoPatternInterfaceError,正如你之前所说的,但我不知道究竟是为什么。我如何知道是否实现了转换模式?但无论哪种方式,我都会从 app 得到不同的错误,正如我在上一个回答中所说:app.iface_transform.Resize(300, 300) _ctypes.COMError: (-2146233079, None, (None, None, None, 0, None))

以上是关于Pywinauto:如何调整活动窗口的大小的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 闪烁/损坏,窗口调整大小和 DWM 处于活动状态

在 Unity 中,如何检测窗口是不是正在调整大小以及窗口是不是已停止调整大小

当鼠标悬停在边框上时,如何完全禁用调整窗口大小,包括调整大小图标?

如何使 Tkinter 窗口无法调整大小?

创建特定窗口后如何调整其大小?

如何动态调整电子邮件客户端中的图像大小?