プロセスIDからウィンドウハンドルを取得する
前書き
「プロセスIDならわかるけど、ウィンドウハンドルはわからないなー」なんていう状況、よくありますよね?
僕は先ほど初めてそのような状況に出くわしましたけど。
流れ
トップレベルウィンドウを列挙
各ウィンドウのプロセスIDを調べる
目当てのプロセスIDが見つかったら、そのウィンドウのウィンドウハンドルを返す
ソース
// // プロセスIDからウィンドウハンドルを取得する。 // トップレベルウィンドウを列挙して、プロセスIDが一致するやつのHWNDを返す。 // 同じプロセスIDでトップレベルウィンドウが複数個あった場合は // どうなっても知らない。 // HWND GetWindowHandle( // 戻り値: 成功 望みのHWND / 失敗 NULL const DWORD TargetID) // プロセスID { HWND hWnd = GetTopWindow(NULL); do { if(GetWindowLong( hWnd, GWL_HWNDPARENT) != 0 || !IsWindowVisible( hWnd)) continue; DWORD ProcessID; GetWindowThreadProcessId( hWnd, &ProcessID); if(TargetID == ProcessID) return hWnd; } while((hWnd = GetNextWindow( hWnd, GW_HWNDNEXT)) != NULL); return NULL; }
注意
ただし、トップレベルウィンドウ(親ウィンドウがない普通の窓)が、複数あるようなアプリケーションでは、Zオーダーが上の窓(より前面にある窓)が返されます。
なのでIEのような、1つのプロセスで複数のウィンドウが開くアプリケーションに対して実行する場合は要注意。
あとがき
10/04/01追記
教えて!gooの質問にも載ってました。