代码之家  ›  专栏  ›  技术社区  ›  CopyPasteIt

如何使用pywinauto使窗口(已在运行的任务)可见?

  •  0
  • CopyPasteIt  · 技术社区  · 7 年前

    除了在这个网站上寻找答案,我还签了

    pywinauto.application module

    Getting Started Guide

    但我还是被难住了。

    我手动启动记事本,并希望下面代码的第一个while块使记事本窗口可见。第二个while block有效,但我对线路感到困惑

    dlg_spec = app.UntitledNotepad
    

    这是怎么回事?这是一种什么样的python方法?

    问题:如何获取第一个while代码块使窗口标题

    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 回复  |  直到 7 年前
        1
  •  3
  •   Jakub Bláha    7 年前

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

    import win32gui
    
    hwnd = win32gui.FindWindow(None, 'Notepad')
    
    win32gui.SetForegroundWindow(hwnd)
    win32gui.ShowWindow(hwnd, 9)
    

    号码 9 代表 SW_RESTORE 如图所示 here

        2
  •  1
  •   Vasily Ryabov    7 年前

    第一个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\u focus() ),Python可以 wrapper_object() 隐式调用(访问属性时 set_focus 动态)。