Как сделать окно (уже запущенное задание) видимым с помощью pywinauto? - PullRequest
0 голосов
/ 14 мая 2018

Помимо поиска ответов на этом сайте, я проверил

модуль pywinauto.application

и

Руководство по началу работы

но я все еще в замешательстве.

Я вручную запускаю блокнот и хочу, чтобы первый блок while следующего кода сделал окно блокнота видимым.Второй блок while работает, но я запутался в строке

dlg_spec = app.UntitledNotepad

Что здесь происходит?Что это за метод python?

Вопрос: Как получить первый блок кода, чтобы сделать окно с заголовком

Untitled - Notepad

видимым?

#--------*---------*---------*---------*---------*---------*---------*---------*
# Desc: Set focus on a window
# #--------*---------*---------*---------*---------*---------*---------*---------*

import sys
import pywinauto


#                                  # Manually started Notepad
#                                  # Want to make it visible (windows focus)
#                                  # Program runs, but...
while 1:
    handle = pywinauto.findwindows.find_windows(title='Untitled - Notepad')[0] 
    app = pywinauto.application.Application()
    ac = app.connect(handle=handle)
    print(ac)
    topWin = ac.top_window_()
    print(topWin)
    sys.exit()

#                                  # Working Sample Code
while 0:
    app = pywinauto.Application().start('notepad.exe')
    # describe the window inside Notepad.exe process
#                                  # ?1: '.UntitledNotepad' - huh?
    dlg_spec = app.UntitledNotepad
    # wait till the window is really open
    actionable_dlg = dlg_spec.wait('visible')
    sys.exit()

Для удобства этот код делает свое дело:

#                                  # Manually started Notepad
#                                  # Want to make it visible (windows focus).
#                                  # 
#                                  # Two or three lines solution provided by
#                                  # Vasily Ryabov's overflow answer
#                                  # (wrapper ribbon and bow stuff).
while 1:
    app = pywinauto.application.Application().connect(title="Untitled - Notepad")
    dlg_spec = app.window(best_match="UntitledNotepad")
    dlg_spec.set_focus()
    sys.exit()

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Ну, первый цикл while должен быть переписан с использованием тех же методов, за исключением find_windows (это низкий уровень и не рекомендуется для прямого использования).Вам нужен метод .set_focus(), чтобы вывести окно на передний план.

app = pywinauto.Application().connect(title="Untitled - Notepad")
app.UntitledNotepad.set_focus()

Создание спецификации окна dlg_spec = app.UntitledNotepad означает, что app вызывается метод __getattribute__.Наконец, эта строка эквивалентна dlg_spec = app.window(best_match="UntitledNotepad").Чтобы найти настоящую оболочку, вам нужно вызвать .wait(...) или .wrapper_object().

Но когда вы вызываете действие (например, .set_focus()), Python может выполнить вызов wrapper_object() для вас неявно (при обращении катрибут set_focus динамически).

0 голосов
/ 14 мая 2018

Я бы предложил вам использовать библиотеку win32gui для этой задачи, как показано ниже:

import win32gui

hwnd = win32gui.FindWindow(None, 'Notepad')

win32gui.SetForegroundWindow(hwnd)
win32gui.ShowWindow(hwnd, 9)

Число 9 представляет SW_RESTORE, как показано здесь

...