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

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

特定アプリケーションの列挙

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

特定のアプリケーションをすべて列挙したい場合にも 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つのアプリケーションを列挙しています。

関連記事



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

コメントを投稿

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