使用 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)

我需要处理更多功能,但似乎无法理解该做什么

  1. 如何检查 window 是否处于活动状态(window 的状态)
  2. 如何在桌面上打开所有当前windows
  3. 我正在使用 move_window 来调整 window 的大小,将 x 和 y 坐标保持为 0,但是如何保持 window 的大小相同,并将它移动到x 和 y 坐标
  4. 我正在使用 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) 的结果,但由于我对子流程不是很熟悉,所以我不能肯定地说这是一个很好的方法。

希望对您有所帮助。