プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

子ウインドウの列挙

2007年09月28日 08時10分00秒 | ウインドウ関連

子ウインドウ(コントロール)のウインドウ・ハンドルを列挙するには 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 関数で取得するウインドウ・ハンドルをメモ帳やペイントなどにすると面白いです。
  • この関数を上手く利用するとコピーできないダイアログやウインドウの文字列を取得できるようになります。
  • またリストボックス、コンボボックス、リストビューなどのコントロールに設定されている文字列も可能です。

関連記事



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 可視ウインドウの列挙 | トップ | スレッド・ウインドウの列挙 »
最新の画像もっと見る

コメントを投稿

ウインドウ関連」カテゴリの最新記事