【问题标题】:Using pywinauto to perform various tasks on a window使用 pywinauto 在窗口上执行各种任务
【发布时间】:2020-04-14 20:16:09
【问题描述】:

我在 Microsoft Windows 上使用 python (3.7.4) 中的 pywinauto 模块来自动化桌面上的窗口。我需要制作各种功能来在桌面上打开的窗口上执行任务,例如获取窗口、聚焦窗口、最大化和最小化、关闭窗口、移动和调整窗口大小或检查窗口是否处于活动状态。 以下是我的代码

from pywinauto import application
import time

app=application.Application()
app.start('Notepad.exe')
time.sleep(5)
app1 = app.top_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. 如何检查窗口是否处于活动状态(窗口状态)
  2. 如何在桌面上打开所有当前窗口
  3. 我正在使用 move_window 来调整窗口大小,将 x 和 y 坐标保持为 0,但是如何保持窗口大小相同并仅移动 x 和 y 坐标
  4. 我正在使用 app.start() 运行应用程序,但是如果我需要运行已经存在的 excel 文件或 pdf 文件,那么我需要放置 excel 或 adobe 的可执行路径以及我需要打开的文件,如果是,我该怎么做

【问题讨论】:

  • 我在 Python 2.5.4 的日子里使用 Pywinauto,但花了一段时间才获得 Py 3 的支持。在我切换到 Py 3 的时候,我学会了使用 pywin32 库,为此我知道如何做这些事情。另一个库会是一个选择吗?如果没有,对 Pywinauto for Py 3 有更多了解的人应该回答,但是如果您能够使用另一个库,那么这些要点都是简单的两行代码。
  • @S.Bender 虽然我被要求使用 pywinauto 模块,但任何其他可能更灵活的模块都可以作为备份选项帮助我,所以请您与我分享您对 pywin32 模块的知识执行上述操作。

标签: python pywinauto


【解决方案1】:

因为我对 pywin32 比较熟悉,所以这是用 pywin32 做上述事情的一种方式。 这些代码示例假设您知道要测试的窗口的 hwnd

1) 窗口主动检查 test_hwnd == win32gui.GetForegroundWindow() 会给你布尔值是否是前台窗口(我对活动的理解)

2) 所有窗口的列表(保存到字典{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 命令行界面之一来“打开...” 就像是 os.system("c:/path/to/exe.exe c:/path/to/file.ending") 你最好在这里使用 subprocess,因为它比 os 有更好的错误处理,但是 Stackoverflow 上有足够的答案关于如何使用 subprocess。你可能最终会得到类似subprocess.call("c:/path/to/exe.exe c:/path/to/file.ending", shell=True) 的东西,但由于我对子流程不是很熟悉,所以我不能肯定这是一个很好的方法。

我希望这对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多