CopyPasteIt
CopyPasteIt

Reputation: 574

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

Besides looking for answers on this site, I checked out

pywinauto.application module

and

Getting Started Guide

but I'm still stumped.

I manually start notepad and want the first while block of the following code to make the notepad window visible. The second while block works but I am confused about the line

dlg_spec = app.UntitledNotepad

What is going on here? What kind of a python method is this?

Question: How do I get the first while block of code make the window titled

Untitled - Notepad

visible?

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

For convenience this code does the trick:

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

Upvotes: 0

Views: 7015

Answers (2)

Vasily Ryabov
Vasily Ryabov

Reputation: 10000

Well, the first while loop should be re-written using the same methods except find_windows (it's low level and not recommended for direct usage). You need method .set_focus() to bring the window to foreground.

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

Creating window specification dlg_spec = app.UntitledNotepad means that app method __getattribute__ is called. Finally this line is equivalent to dlg_spec = app.window(best_match="UntitledNotepad"). To find the actual wrapper you need to call .wait(...) or .wrapper_object().

But when you call an action (like .set_focus()), Python can do the wrapper_object() call for you implicitly (while accessing attribute set_focus dynamically).

Upvotes: 1

Jakub Bláha
Jakub Bláha

Reputation: 1619

I would suggest you using the win32gui library for this task as shown below:

import win32gui

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

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

The number 9 represents SW_RESTORE as shown here

Upvotes: 3

Related Questions