2016-09-30 272 views
3

使用Python驱动的自动化工具。Pywinauto:无法使窗口前景

想象有应用程序运行的池:

APPS_POOL = ['Chrome', 'SomeApp', 'Foo'] 

脚本在循环(每秒)运行,并需要在它们之间随意切换:

# Init App object 
app = application.Application() 

# Select random app from the pull of apps 
random_app = random.choice(APPS_POOL) 
app.connect(title_re=".*%s" % random_app) 
print 'Select "%s"' % random_app 

# Access app's window object 
app_dialog = app.window_(title_re=".*%s.*" % random_app) 

if app_dialog.Exists(): 
    app_dialog.SetFocus() 

第一次它的工作原理很好,但其他 - 窗户不会被带到前台。有任何想法吗?

编辑:脚本从Win7 CMD运行。一旦焦点设置为其他窗口,系统是否有可能以某种方式阻止CMD设置焦点?

回答

6

我认为SetFocus是有点bug。至少在我的机器上出现错误:error: (87, 'AttachThreadInput', 'The parameter is incorrect.')。所以也许你可以玩Minimize/Restore。请注意,这种方法也不是防弹的。

import random 
import time 
from pywinauto import application 
from pywinauto.findwindows import WindowAmbiguousError, WindowNotFoundError 

APPS_POOL = ['Chrome', 'GVIM', 'Notepad', 'Calculator', 'SourceTree', 'Outlook'] 


# Select random app from the pull of apps 
def show_rand_app(): 
    # Init App object 
    app = application.Application() 

    random_app = random.choice(APPS_POOL) 
    try: 
     print 'Select "%s"' % random_app 
     app.connect(title_re=".*%s.*" % random_app) 

     # Access app's window object 
     app_dialog = app.top_window_() 

     app_dialog.Minimize() 
     app_dialog.Restore() 
     #app_dialog.SetFocus() 
    except(WindowNotFoundError): 
     print '"%s" not found' % random_app 
     pass 
    except(WindowAmbiguousError): 
     print 'There are too many "%s" windows found' % random_app 
     pass 

for i in range(15): 
    show_rand_app() 
    time.sleep(0.3) 
+0

很好@vitswd,它的工作原理!看起来像'Focus()'的确有问题。另外,使用'try..except'的好主意。 – Oleg

+0

只是好奇,你是如何收到这个错误(控制台,你尝试调试)? – Oleg

+0

我在IPython中玩过你的代码,当SetFocus在 – vitswd

1

接受的答案在某些情况下无法正常工作 - 某些基于Qt4-5的应用程序不会在某些原因下正确加载GUI。所以,我发现了另一个SetFocus()bug的解决方法。

from pywinauto import Application, win32defines 
from pywinauto.win32functions import SetForegroundWindow, ShowWindow 

app = Application().connect(path="C:\path\to\process.exe") 
w = app.top_window() 

#bring window into foreground 
if w.HasStyle(win32defines.WS_MINIMIZE): # if minimized 
    ShowWindow(w.wrapper_object(), 9) # restore window state 
else: 
    SetForegroundWindow(w.wrapper_object()) #bring to front 
+0

上失败时,我看到上面的错误。我看到Qt5应用程序(WireShark)的这个问题。将修复pywinauto 0.6.4。 –