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

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

すべてのウインドウの復元

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

最小化/最大化ウインドウをすべて復元するには可視ウインドウを検索して次のようにします。(戻る)

  1. 可視ウインドウか調べる(IsWindowVisible)
  2. オーナーのウインドウか調べる(GetWindow)
  3. キャプションが有るか調べる(空でない文字列)
  4. クラスが Progman 以外か調べる(lstrcmp)
  5. 最小化スタイルが有るか調べる(WS_MINIMIZEBOX)
  6. 最小化されているか調べる(IsIconic)
  7. 最大化スタイルが有るか調べる(WS_MAXIMIZEBOX)
  8. 最大化されているか調べる(IsZoomed)
  9. (1)~(8)までの条件が一致したら復元の対象となります。

プロトタイプ宣言

BOOL IsWindowVisible(
    HWND            hWnd            // ウインドウのハンドル
);

HWND GetWindow(
    HWND            hWnd,           // ウインドウのハンドル
    UINT            uCmd            // ウインドウ関係の指定
);

BOOL EnumWindows(
    WNDENUMPROC     lpEnumFunc,     // コールバック関数
    LPARAM          lParam          // コールバック関数に渡す値
);

BOOL CALLBACK EnumWindowsProc(
    HWND            hwnd,           // 親ウインドウのハンドル
    LPARAM          lParam          // EnumWindows 関数から受け取る値
);

サンプル

#include <stdio.h>
#include <windows.h>

// オーナー・ウインドウの判別
#define IsWindowOwner(h)        (GetWindow(h,GW_OWNER) == NULL)
#define IsWindowDialog(s)       (lstrcmp(s,TEXT("#32770")) == 0)
#define IsWindowIconic(h,n)     (((n) & WS_MINIMIZEBOX) && IsIconic(h))
#define IsWindowZoomed(h,n)     (((n) & WS_MAXIMIZEBOX) && IsZoomed(h))

// ウインドウ状態の表示
VOID DispStatus( HWND hWnd, LPCTSTR lpTitle, LPCTSTR lpClass, LONG lStyle )
{
    printf( TEXT("%c %c %c %c %c %c %c %c %c [%-50s] [%s]\n"),
        IsWindowOwner(hWnd)         ? TEXT('O') : TEXT('_'),    // Ownerウインドウ
        IsWindowUnicode(hWnd)       ? TEXT('U') : TEXT('_'),    // Unicodeタイプ
        IsWindowVisible(hWnd)       ? TEXT('V') : TEXT('_'),    // 可視状態
        IsWindowEnabled(hWnd)       ? TEXT('E') : TEXT('_'),    // 有効状態
        IsIconic(hWnd)              ? TEXT('I') : TEXT('_'),    // 最小化状態
        IsZoomed(hWnd)              ? TEXT('Z') : TEXT('_'),    // 最大化状態
        IsWindow(hWnd)              ? TEXT('W') : TEXT('_'),    // ウインドウ有無
        (lStyle & WS_MINIMIZEBOX)   ? TEXT('i') : TEXT('_'),    // 最小化スタイル
        (lStyle & WS_MAXIMIZEBOX)   ? TEXT('z') : TEXT('_'),    // 最大化スタイル
        lpClass,                                                // クラス文字列
        lpTitle );                                              // キャプション
}

// EnumWindowsのコールバック関数
BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam )
{
    TCHAR   szTitle[ 1024 ];
    TCHAR   szClass[ 1024 ];
    INT*    lpCount = (INT *)lParam;
    LONG    lStyle;
    
    GetWindowText( hWnd, szTitle, sizeof(szTitle) );    // キャプションの取得
    GetClassName(  hWnd, szClass, sizeof(szClass) );    // クラス文字列の取得
    lStyle = GetWindowLong( hWnd, GWL_STYLE );          // ウインドウスタイル
    // ウインドウの復元条件
    if ( IsWindowVisible(hWnd) ){
        if ( IsWindowOwner(hWnd) || IsWindowDialog(szClass) ){
            if ( szTitle[0] != TEXT('\0') ){
                if ( lstrcmp(szClass,TEXT("Progman")) != 0 ){
                    while ( IsWindowIconic(hWnd,lStyle) || IsWindowZoomed(hWnd,lStyle) ){
                        // 列挙番号
                        *lpCount += 1;
                        printf( TEXT("%4d: "), *lpCount );
                        DispStatus( hWnd, szTitle, szClass, lStyle );
                        // ウインドウの復元
                        ShowWindow( hWnd, SW_RESTORE );
                    }
                }
            }
        }
    }
    return TRUE;
}

// メイン関数
int main( void )
{
    INT nCount = 0;
    
    // ウインドウの復元
    EnumWindows( EnumWindowsProc, (LPARAM)&nCount );
    // 復元した数の表示
    printf( TEXT("\n全部で %d 個のウインドウを復元しました。\n"), nCount );
    return 0;
}
  • 最小化されているウインドウはすべて元のウインドウ状態に戻ります。
  • 最大化されているウインドウがすべて元のウインドウ状態に戻ります。
  • 実行すると最小化/最大化されていない元のウインドウ状態に戻ります。

補足

  • オーナー・ウインドウが最大化スタイルを持っていなくても子ウインドウが最大化スタイルを持つタイプは上記のサンプルでは復元できません。
  • このようなウインドウも復元するには EnumChildWindows 関数などで子ウインドウの最大化スタイルも探索する必要があります。

関連記事



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 最大化ウインドウの復元 | トップ | マウス・キャプチャの取得/... »
最新の画像もっと見る

コメントを投稿

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