特定のアプリケーションをすべて列挙したい場合にも EnumWindows 関数を使います。
そして列挙するアプリケーションのクラス名とキャプションの文字列を指定します。
キャプションの文字列が一定でない場合はクラス名を使って列挙することになります。(戻る)
プロトタイプ宣言
BOOL EnumWindows( WNDENUMPROC lpEnumFunc, // コールバック関数 LPARAM lParam // コールバック関数に渡す値 ); BOOL CALLBACK EnumWindowsProc( HWND hWnd, // 親ウインドウのハンドル LPARAM lParam // EnumWindows 関数から受け取る値 );
サンプル
#include <stdio.h> #include <windows.h> // 列挙アプリケーションの定数 #define TYP_NOTEPAD (1) #define TYP_BROWSER (2) #define TYP_EXPLORE (3) // オーナー・ウインドウの判別 #define IsWindowOwner(h) (GetWindow(h,GW_OWNER) == NULL) // EnumWindowsのコールバック関数 BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam ) { LPCTSTR lpClassName; TCHAR szTitle[ 1024 ]; TCHAR szClass[ 1024 ]; INT* lpParam = (INT *)lParam; GetWindowText( hWnd, szTitle, sizeof(szTitle) ); // キャプションの取得 GetClassName( hWnd, szClass, sizeof(szClass) ); // クラス文字列の取得 switch ( lpParam[1] ){ case TYP_NOTEPAD: lpClassName = TEXT("Notepad"); break; case TYP_BROWSER: lpClassName = TEXT("IEFrame"); break; case TYP_EXPLORE: lpClassName = TEXT("CabinetWClass"); break; default: printf( TEXT("列挙アプリケーションの定数が間違っています。\n") ); return FALSE; } // 列挙ウインドウの表示 if ( !lstrcmp(szClass,lpClassName) ){ lpParam[0] += 1; // カウント加算 printf( TEXT("%03d %c %c %c %c %c %c %c [%-50s] [%s]\n"), lpParam[0], // 列挙番号 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 ) { // ヘッダのメッセージ static TCHAR szHead[] = { TEXT("No. O U V E I Z W クラス名 キャプション\n") TEXT("--- ------------- ---------------------------------------------------- ------------\n") }; // 見つからないメッセージ static TCHAR szNotFound[] = { TEXT("1つも見つかりませんでした。\n") }; // パラメータの配列(列挙カウンタ,列挙アプリケーションの定数) static INT nParam[][ 2 ] = { 0, TYP_NOTEPAD, 0, TYP_BROWSER, 0, TYP_EXPLORE, 0, -1, }; // メモ帳の列挙 printf( TEXT("\n★メモ帳の列挙\n") ); printf( szHead ); if ( EnumWindows(EnumWindowsProc,(LPARAM)nParam[0]) ){ printf( (nParam[0][0] == 0) ? szNotFound : TEXT("") ); } // IEブラウザの列挙 printf( TEXT("\n★IEブラウザの列挙\n") ); printf( szHead ); if ( EnumWindows(EnumWindowsProc,(LPARAM)nParam[1]) ){ printf( (nParam[1][0] == 0) ? szNotFound : TEXT("") ); } // エクスプローラの列挙 printf( TEXT("\n★エクスプローラの列挙\n") ); printf( szHead ); if ( EnumWindows(EnumWindowsProc,(LPARAM)nParam[2]) ){ printf( (nParam[2][0] == 0) ? szNotFound : TEXT("") ); } // わざと間違った定数を渡す printf( TEXT("\n★わざと間違った定数の列挙\n") ); printf( szHead ); if ( EnumWindows(EnumWindowsProc,(LPARAM)nParam[3]) ){ printf( (nParam[3][0] == 0) ? szNotFound : TEXT("") ); } return 0; }
- サンプルでは「メモ帳」「IEブラウザ」「エクスプローラ」の3つのアプリケーションを列挙しています。
関連記事
- 指定ウインドウの状態
- 指定ウインドウの検索
- 指定の子ウインドウの検索
- Zオーダーのウインドウを取得
- Zオーダーの前後ウインドウを取得
- 最初の子ウインドウを取得
- トップレベル・ウインドウの列挙
- 可視ウインドウの列挙
- 特定アプリケーションの列挙
- 子ウインドウの列挙
- スレッド・ウインドウの列挙
※コメント投稿者のブログIDはブログ作成者のみに通知されます