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

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

ウインドウの最大化

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

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

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

プロトタイプ宣言

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)

// ウインドウ状態の表示
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 ){
                    if ( (lStyle & WS_MAXIMIZEBOX) && !IsZoomed(hWnd) ){
                        // 列挙番号
                        *lpCount += 1;
                        printf( TEXT("%4d: "), *lpCount );
                        DispStatus( hWnd, szTitle, szClass, lStyle );
                        // 最大化
                        ShowWindow( hWnd, SW_MAXIMIZE );
                    }
                }
            }
        }
    }
    return TRUE;
}

// メイン関数
int main( void )
{
    INT nCount = 0;
    
    // ウインドウの最大化
    EnumWindows( EnumWindowsProc, (LPARAM)&nCount );
    // 最大化した数の表示
    printf( TEXT("\n全部で %d 個のウインドウを最大化しました。\n"), nCount );
    return 0;
}
  • オーナー・ウインドウが最大化スタイルを持っていなくても子ウインドウが最大化スタイルを持つタイプは上記のサンプルでは最大化できません。
  • このようなウインドウも最大化するには EnumChildWindows 関数などで子ウインドウの最大化スタイルも探索する必要があります。

関連記事



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

コメントを投稿

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