子ウインドウ(コントロール)のウインドウ・ハンドルを列挙するには EnumChildWindows 関数を使います。
以前に同じような事を FindWindowEx 関数を使って列挙する方法を紹介しましたがこちらの関数のは列挙するための専用関数です。
よってキャプションやクラス名、その他のきめ細かい列挙が必要な場合にはこの関数で列挙すべきです。
今回はすべての子ウインドウを列挙していますが条件を指定しての列挙もコールバック関数内で処理すれば自由自在に行えます。(戻る)
プロトタイプ宣言
BOOL EnumChildWindows( HWND hWndParent, // 親ウインドウのハンドル WNDENUMPROC lpEnumFunc, // コールバック関数 LPARAM lParam // コールバック関数に渡す値 ); BOOL CALLBACK EnumChildProc( HWND hwnd, // 子ウインドウのハンドル LPARAM lParam // EnumChildWindows 関数から受け取る値 );
サンプル
#include <stdio.h> #include <windows.h> // オーナー・ウインドウの判別 #define IsWindowOwner(h) (GetWindow(h,GW_OWNER) == NULL) // EnumChildWindowsのコールバック関数 BOOL CALLBACK EnumChildProc( 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; HWND hCalc; // 電卓のウインドウ・ハンドルを取得 if ( (hCalc = FindWindow(TEXT("SciCalc"),TEXT("電卓"))) != NULL ){ // すべての子ウインドウを列挙 EnumChildWindows( hCalc, EnumChildProc, (LPARAM)&nCount ); // 列挙数の表示 printf( TEXT("\n全部で %d 個の子ウインドウを列挙しました。\n"), nCount ); } else{ printf( TEXT("電卓を起動してから実行して下さい。\n") ); } return 0; }
- FindWindow 関数で取得するウインドウ・ハンドルをメモ帳やペイントなどにすると面白いです。
- この関数を上手く利用するとコピーできないダイアログやウインドウの文字列を取得できるようになります。
- またリストボックス、コンボボックス、リストビューなどのコントロールに設定されている文字列も可能です。
関連記事
- 指定ウインドウの状態
- 指定ウインドウの検索
- 指定の子ウインドウの検索
- Zオーダーのウインドウを取得
- Zオーダーの前後ウインドウを取得
- 最初の子ウインドウを取得
- トップレベル・ウインドウの列挙
- 可視ウインドウの列挙
- 特定アプリケーションの列挙
- 子ウインドウの列挙
- スレッド・ウインドウの列挙
※コメント投稿者のブログIDはブログ作成者のみに通知されます