2016-09-30 12 views
3

Pythonの自動化ツールで作業しています。アプリ実行中のプールがある想像Pywinauto:ウィンドウをフォアグラウンドにできません

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

それが動作する最初の時間を:スクリプトはループ(毎秒)で実行され、それらの間でランダムに切り替える必要がある

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

罰金だが、他のすべて - 窓は前景に持ち込まれないだろう。何か案は?

EDIT:スクリプトはWin7 CMDから実行されます。それは、システムがフォーカスを何らかの形で設定することをCMDがブロックすることは可能ですか?一度フォーカスが他のウィンドウに設定されたら?

答えて

6

私はSetFocusは少しバギーだと思います。少なくとも私のマシンではエラーが発生する: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()バグの別の回避策を見つけました。

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で修正されます。 –

関連する問題