如何使用 pywinauto 使 window(已经 运行 任务)可见?

How do I make a window (already running task) visible using pywinauto?

除了在此站点上寻找答案外,我还查看了

pywinauto.application module

Getting Started Guide

但我还是一头雾水

我手动启动记事本并希望以下代码的第一个 while 块使记事本 window 可见。第二个 while 块有效,但我对行

感到困惑
dlg_spec = app.UntitledNotepad

这是怎么回事?这是什么python方法?

问题:如何获得第一个 while 代码块使 window 标题为

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()

我建议您使用 win32gui 库来完成此任务,如下所示:

import win32gui

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

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

数字9代表SW_RESTORE如图here

好吧,第一个 while 循环应该使用相同的方法重写,除了 find_windows(它是低级的,不建议直接使用)。您需要方法 .set_focus() 将 window 置于前台。

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

正在创建window规范dlg_spec = app.UntitledNotepad意味着app方法__getattribute__被调用。最后这一行等同于 dlg_spec = app.window(best_match="UntitledNotepad")。要找到实际的包装器,您需要调用 .wait(...).wrapper_object().

但是当你调用一个动作时(比如 .set_focus()),Python 可以隐式地为你执行 wrapper_object() 调用(同时动态访问属性 set_focus)。