Использование pywinauto для выполнения различных задач в окне - PullRequest
2 голосов
/ 14 апреля 2020

Я использую модуль pywinauto в python (3.7.4) в Microsoft Windows для автоматизации окна на рабочем столе. Мне нужно сделать различные функции для выполнения задач в окне, открытом на рабочем столе, например, получить окно, сфокусироваться на окне, развернуть и свернуть, закрыть окно, переместить и изменить размер окна или проверить, активно ли окно или нет. Ниже приведен мой код

from pywinauto import application
import time

app=application.Application()
app.start('Notepad.exe')
time.sleep(5)
app1 = app.top_window()

, это базовый код c для открытия любого приложения, а затем мне нужно выполнять другие задачи на отдельных сценариях в качестве пользовательских входных данных.

сосредоточиться на окне, развернуть или свернуть или закрыть окно приложения или изменить размер окна

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. Как получить все текущие windows открытые на рабочем столе
  3. Я использую move_window для изменить размер окна, сохранив координаты x и y равными 0, но как мне сохранить размер окна одинаковым и просто переместить его на координаты x и y
  4. И я использую app.start () для запуска приложения, но если мне нужно запустить уже существующий файл Excel или файл PDF, мне нужно указать пути к исполняемым файлам Excel или Adobe, а также путь к файлу, который мне нужно открыть, и если да, то как мне это сделать

1 Ответ

1 голос
/ 14 апреля 2020

Поскольку я больше знаком с pywin32, это способ делать вещи выше с pywin32. Эти примеры кода предполагают, что вы знаете hwnd окна, которое вы хотите проверить

1) Проверка активного окна test_hwnd == win32gui.GetForegroundWindow() даст вам логическое значение, независимо от того, является ли это окном переднего плана (мое понимание активного)

2) Список всех windows (сохранен в dict {hwnd:title}) (измененная версия Как получить список имен каждого открытого окна? )

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") И вы здесь лучше использовать подпроцесс, так как он лучше обрабатывает ошибки, чем os, но в Stackoverflow достаточно ответов о том, как использовать подпроцесс. Вы, вероятно, в конечном итоге получите что-то вроде subprocess.call("c:/path/to/exe.exe c:/path/to/file.ending", shell=True), но, поскольку я не очень хорошо знаком с подпроцессом, я не могу сказать, что это хороший способ сделать это.

Надеюсь, это поможет вам.

...