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

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

スレッド・ウインドウの列挙

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

スレッドに関連付けられたウインドウをすべて列挙するには EnumThreadWindows 関数を使います。
列挙の手順は次のようになります。(戻る)

  1. 指定ウインドウからスレッドIDを取得(GetWindowThreadProcessId)
  2. スレッドに関連付けられているウインドウを列挙(EnumThreadWindows)
  3. コールバック関数内でいろいろと情報表示(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を取得できます。
  • これを使って自分自身のスレッドに関連付けられているウインドウを列挙できます。
  • なおサンプルのようなコンソール・アプリケーションではウインドウを持たないため自分自身のスレッドを列挙することは出来ません。

関連記事



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

コメントを投稿

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