使用 pywinauto 在 window 上执行各种任务
Using pywinauto to perform various tasks on a window
我在 Microsoft Windows 上使用 python (3.7.4) 中的 pywinauto 模块在桌面上自动化 window。我需要使用各种功能在桌面上打开的 window 上执行任务,例如获取 window、关注 window、最大化和最小化、关闭 window、移动并调整 window 大小或检查 window 是否处于活动状态。
以下是我的代码
from pywinauto import application
import time
app=application.Application()
app.start('Notepad.exe')
time.sleep(5)
app1 = app.top_window()
这是打开任何应用程序的基本代码,然后我需要在单独的脚本上执行其他任务作为用户输入。
以下重点关注window,最大化或最小化或关闭window应用程序或调整window
app1.set_focus()
time.sleep(2)
app1.maximize()
time.sleep(2)
app1.minimize()
app1.close()
app.Notepad.move_window(0,0,1280,700)
我需要处理更多功能,但似乎无法理解该做什么
- 如何检查 window 是否处于活动状态(window 的状态)
- 如何在桌面上打开所有当前windows
- 我正在使用 move_window 来调整 window 的大小,将 x 和 y 坐标保持为 0,但是如何保持 window 的大小相同,并将它移动到x 和 y 坐标
- 我正在使用 app.start() 来 运行 一个应用程序,但是如果我需要 运行 一个已经存在的 excel 文件或 pdf 文件,我也可以需要放置 excel 或 adobe 的可执行路径以及我需要打开的文件的路径,如果是,我该如何执行
由于我对pywin32比较熟悉,所以这是用pywin32做上述事情的一种方式。
这些代码示例假定您知道要测试的 window 的 hwnd
1) Window 主动检查
test_hwnd == win32gui.GetForegroundWindow()
会给你布尔值是否是前景 window(我对 active 的理解)
2) 所有 windows 的列表(保存到字典 {hwnd:title}
)
(How to get a list of the name of every open window? 的修改版本)
def get_all_windows():
windows_by_hwnd = {}
def winEnumHandler(hwnd, ctx):
title = win32gui.GetWindowText(hwnd)
if win32gui.IsWindowVisible(hwnd) and title:
windows_by_hwnd[hwnd] = title
win32gui.EnumWindows( winEnumHandler, None )
return windows_by_hwnd
3)
def move_by_offset(hwnd, x, y):
rect = win32gui.GetWindowRect(hwnd)
win32gui.MoveWindow(hwnd, rect[0]+x, rect[1]+y, rect[2]+x, rect[3]+y, True)
def move_to(hwnd, x, y):
rect = win32gui.GetWindowRect(hwnd)
win32gui.MoveWindow(hwnd, x, y, rect[2]-rect[0], rect[3]-rect[1], True)
4)
我建议使用许多 Python 命令行界面之一来执行 windows "open with..."
就像是
os.system("c:/path/to/exe.exe c:/path/to/file.ending")
你最好在这里使用 subprocess,因为它比 os 有更好的错误处理,但是 Whosebug 上有足够的关于如何使用 subprocess 的答案。你可能会得到类似 subprocess.call("c:/path/to/exe.exe c:/path/to/file.ending", shell=True)
的结果,但由于我对子流程不是很熟悉,所以我不能肯定地说这是一个很好的方法。
希望对您有所帮助。
我在 Microsoft Windows 上使用 python (3.7.4) 中的 pywinauto 模块在桌面上自动化 window。我需要使用各种功能在桌面上打开的 window 上执行任务,例如获取 window、关注 window、最大化和最小化、关闭 window、移动并调整 window 大小或检查 window 是否处于活动状态。 以下是我的代码
from pywinauto import application
import time
app=application.Application()
app.start('Notepad.exe')
time.sleep(5)
app1 = app.top_window()
这是打开任何应用程序的基本代码,然后我需要在单独的脚本上执行其他任务作为用户输入。
以下重点关注window,最大化或最小化或关闭window应用程序或调整window
app1.set_focus()
time.sleep(2)
app1.maximize()
time.sleep(2)
app1.minimize()
app1.close()
app.Notepad.move_window(0,0,1280,700)
我需要处理更多功能,但似乎无法理解该做什么
- 如何检查 window 是否处于活动状态(window 的状态)
- 如何在桌面上打开所有当前windows
- 我正在使用 move_window 来调整 window 的大小,将 x 和 y 坐标保持为 0,但是如何保持 window 的大小相同,并将它移动到x 和 y 坐标
- 我正在使用 app.start() 来 运行 一个应用程序,但是如果我需要 运行 一个已经存在的 excel 文件或 pdf 文件,我也可以需要放置 excel 或 adobe 的可执行路径以及我需要打开的文件的路径,如果是,我该如何执行
由于我对pywin32比较熟悉,所以这是用pywin32做上述事情的一种方式。 这些代码示例假定您知道要测试的 window 的 hwnd
1) Window 主动检查
test_hwnd == win32gui.GetForegroundWindow()
会给你布尔值是否是前景 window(我对 active 的理解)
2) 所有 windows 的列表(保存到字典 {hwnd:title}
)
(How to get a list of the name of every open window? 的修改版本)
def get_all_windows():
windows_by_hwnd = {}
def winEnumHandler(hwnd, ctx):
title = win32gui.GetWindowText(hwnd)
if win32gui.IsWindowVisible(hwnd) and title:
windows_by_hwnd[hwnd] = title
win32gui.EnumWindows( winEnumHandler, None )
return windows_by_hwnd
3)
def move_by_offset(hwnd, x, y):
rect = win32gui.GetWindowRect(hwnd)
win32gui.MoveWindow(hwnd, rect[0]+x, rect[1]+y, rect[2]+x, rect[3]+y, True)
def move_to(hwnd, x, y):
rect = win32gui.GetWindowRect(hwnd)
win32gui.MoveWindow(hwnd, x, y, rect[2]-rect[0], rect[3]-rect[1], True)
4)
我建议使用许多 Python 命令行界面之一来执行 windows "open with..."
就像是
os.system("c:/path/to/exe.exe c:/path/to/file.ending")
你最好在这里使用 subprocess,因为它比 os 有更好的错误处理,但是 Whosebug 上有足够的关于如何使用 subprocess 的答案。你可能会得到类似 subprocess.call("c:/path/to/exe.exe c:/path/to/file.ending", shell=True)
的结果,但由于我对子流程不是很熟悉,所以我不能肯定地说这是一个很好的方法。
希望对您有所帮助。