プロセス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の質問にも載ってました。