すべてのウインドウを最大化するには可視ウインドウを検索して次のようにします。(戻る)
- 可視ウインドウか調べる(IsWindowVisible)
- オーナーのウインドウか調べる(GetWindow)
- キャプションが有るか調べる(空でない文字列)
- クラスが Progman 以外か調べる(lstrcmp)
- 最大化スタイルが有るか調べる(WS_MAXIMIZEBOX)
- 最大化されていないか調べる(IsZoomed)
- (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 関数などで子ウインドウの最大化スタイルも探索する必要があります。
※コメント投稿者のブログIDはブログ作成者のみに通知されます