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
函数用于resizeTo
或size
,但也没有任何反应。
如果我运行以下命令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 对象尝试这些方法(假设 app
是 UIAWrapper
实例)。在您的代码中,它应该如下所示:
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 中,如何检测窗口是不是正在调整大小以及窗口是不是已停止调整大小