2017-09-16 105 views
0

プログラム(既知のPID)をトップ/アクティブ/フォアグラウンドに設定しようとしています(どちらが最も適切かはわかりません)。 PIDが アクティブ/フォアグラウンドウィンドウをPIDから設定する

handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, 
         False, pid) 
    win32gui.SetForegroundWindow(handle) 
    win32gui.SetActiveWindow(handle) 

PID

Windowsプロセスに設定されている

私が得る次のいずれか

pywintypes.error: (1400, 'SetForegroundWindow', 'Invalid window Handle.') 

    pywintypes.error: (1400, 'SetActiveWindow', 'Invalid window handle.') 

を私はそれがハンドラ内で問題となっている実感が、私が適切になっていますかイムわかりません作業ハンドルを取得します。

答えて

2

このジョブはpywinautoによって行うことができます。

from pywinauto import Application 
app = Application().connect(process=<pid>) 
app.top_window().set_focus() 

しかし、それは最小化アプリを動作しない場合があります。

1

OpenProcess関数:

関数が成功すると、戻り値は指定されたprocess.andそれは、プロセスへのハンドルを必要とするすべての関数で使用することができますへのオープンハンドルです。

SetForegroundWindow関数:それの

パラメータ活性化し、最前面に表示されるべきウィンドウへのハンドルです。

ので、あなたはこのように変換する必要があります。

HWND h = ::GetTopWindow(0); 
while (h) 
{ 
    DWORD pid; 
    DWORD dwTheardId = ::GetWindowThreadProcessId(h,&pid); 
     if (pid == /*your process id*/) 
     { 
       // here h is the handle to the window 
       break; 
     } 
     h = ::GetNextWindow(h , GW_HWNDNEXT); 
} 

Pythonのバージョン:

def find_window_for_pid(pid): 
    result = None 
    def callback(hwnd, _): 
     nonlocal result 
     ctid, cpid = win32process.GetWindowThreadProcessId(hwnd) 
     if cpid == pid: 
      result = hwnd 
      return False 
     return True 
    win32gui.EnumWindows(callback, None) 
    return result 

いくつかの注意事項:

しかし、これは簡単にしたときので、失敗する可能性があることに注意してください最初にプロセスを起動すると、おそらく数ミリ秒後までウィンドウがありません。親と子の間を同期させる手段がなければ、実際にはこれを回避する方法はありません。 (あなたは1秒間スリープ状態でハックすることができますが、同期の代わりにスリープしようとするときと同じ問題があります。ほとんどの場合、時間がかかるので、コードの応答性/パフォーマンスが低下します理由もなく、コンピュータがビジー状態であるとき、時折、それはあまりにも短いものと失敗します。)

本当にこれを解決する唯一の方法ではなく、標準のPythonコードを使用するプロセスを作成するためにpywin32を使用することです。それから、あなたはそのプロセスを扱います。つまり、子プロセスがウィンドウループを開始し、そのプロセスのウィンドウだけを列挙するのを待つことができます。

+0

pythonの例がありますか? –

関連する問題