スレッドに関連付けられたウインドウをすべて列挙するには EnumThreadWindows 関数を使います。
列挙の手順は次のようになります。(戻る)
- 指定ウインドウからスレッドIDを取得(GetWindowThreadProcessId)
- スレッドに関連付けられているウインドウを列挙(EnumThreadWindows)
- コールバック関数内でいろいろと情報表示(EnumThreadWndProc)
スレッドIDの取得方法には色々とあります。
ここでは指定のウインドウ・ハンドルから取得する方法です。
プロトタイプ宣言
DWORD GetWindowThreadProcessId( HWND hWnd, // ウインドウのハンドル LPDWORD lpdwProcessId // プロセス ID ); BOOL EnumThreadWindows( DWORD dwThreadId, // スレッドの ID WNDENUMPROC lpfn, // コールバック関数 LPARAM lParam // コールバック関数に渡す値 ); BOOL CALLBACK EnumThreadWndProc( HWND hwnd, // ウインドウのハンドル LPARAM lParam // EnumThreadWindows 関数から受け取る値 );
サンプル
#include <stdio.h> #include <windows.h> // オーナー・ウインドウの判別 #define IsWindowOwner(h) (GetWindow(h,GW_OWNER) == NULL) // EnumThreadWindowsのコールバック関数 BOOL CALLBACK EnumThreadWndProc( HWND hWnd, LPARAM lParam ) { TCHAR szTitle[ 1024 ]; TCHAR szClass[ 1024 ]; INT* lpCount = (INT *)lParam; *lpCount += 1; // カウントの加算 GetWindowText( hWnd, szTitle, sizeof(szTitle) ); // キャプションの取得 GetClassName( hWnd, szClass, sizeof(szClass) ); // クラス文字列の取得 // 列挙ウインドウの表示 printf( TEXT("%4d: %c %c %c %c %c %c %c [%-50s] [%s]\n"), *lpCount, // 列挙番号 IsWindowOwner(hWnd) ? 'O' : '_', // Ownerウインドウ IsWindowUnicode(hWnd) ? 'U' : '_', // Unicodeタイプ IsWindowVisible(hWnd) ? 'V' : '_', // 可視状態 IsWindowEnabled(hWnd) ? 'E' : '_', // 有効状態 IsIconic(hWnd) ? 'I' : '_', // 最小化状態 IsZoomed(hWnd) ? 'Z' : '_', // 最大化状態 IsWindow(hWnd) ? 'W' : '_', // ウインドウ有無 szClass, // クラス文字列 szTitle ); // キャプション return TRUE; } // メイン関数 int main( void ) { INT nCount = 0; DWORD dwThredID; HWND hWnd; // 電卓ウインドウの取得 if ( (hWnd = FindWindow(TEXT("SciCalc"),NULL)) == NULL ){ printf( TEXT("電卓は1つも起動されていません。\n") ); return 255; } // 指定ウインドウからスレッドIDの取得 dwThredID = GetWindowThreadProcessId( hWnd, NULL ); // 指定スレッドのウインドウ列挙 EnumThreadWindows( dwThredID, EnumThreadWndProc, (LPARAM)&nCount ); // 列挙数の表示 printf( TEXT("\n全部で %d 個のウインドウを列挙しました。\n"), nCount ); return 0; }
その他
- FindWindow 関数で検索するクラス名を IEFrame に変更して実行するとIEブラウザのスレッドに関連付けられているすべてのウインドウがたくさん列挙されます。
- Windows GUIで作成した場合には GetCurrentThreadId 関数で自分自身のスレッドIDを取得できます。
- これを使って自分自身のスレッドに関連付けられているウインドウを列挙できます。
- なおサンプルのようなコンソール・アプリケーションではウインドウを持たないため自分自身のスレッドを列挙することは出来ません。
関連記事
- 指定ウインドウの状態
- 指定ウインドウの検索
- 指定の子ウインドウの検索
- Zオーダーのウインドウを取得
- Zオーダーの前後ウインドウを取得
- 最初の子ウインドウを取得
- トップレベル・ウインドウの列挙
- 可視ウインドウの列挙
- 特定アプリケーションの列挙
- 子ウインドウの列挙
- スレッド・ウインドウの列挙
※コメント投稿者のブログIDはブログ作成者のみに通知されます