すべてのウインドウを最大サイズに変更するには可視ウインドウを検索して次のようにします。(戻る)
- 可視ウインドウか調べる(IsWindowVisible)
- オーナーのウインドウか調べる(GetWindow)
- キャプションが有るか調べる(空でない文字列)
- クラスが Progman 以外か調べる(lstrcmp)
- サイズ変更スタイルが有るか調べる(WS_THICKFRAME)
- (1)~(5)までの条件が一致したらリサイズの対象となります。
プロトタイプ宣言
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 GetMonitorRect(rc) SystemParametersInfo(SPI_GETWORKAREA,0,rc,0) // ウインドウ状態の表示 VOID DispStatus( HWND hWnd, LPCTSTR lpTitle, LPCTSTR lpClass, LONG lStyle ) { printf( TEXT("%c %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('_'), // 最大化スタイル (lStyle & WS_THICKFRAME) ? TEXT('f') : TEXT('_'), // サイズ変更スタイル lpClass, // クラス文字列 lpTitle ); // キャプション } // EnumWindowsのコールバック関数 BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam ) { TCHAR szTitle[ 1024 ]; TCHAR szClass[ 1024 ]; INT* nParam = (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_THICKFRAME ){ // 列挙番号 nParam[ 0 ] += 1; printf( TEXT("%4d: "), nParam[0] ); DispStatus( hWnd, szTitle, szClass, lStyle ); // ウインドウのリサイズ SetWindowPos( hWnd, NULL, nParam[1], nParam[2], nParam[3], nParam[4], (SWP_SHOWWINDOW|SWP_NOZORDER) ); } } } } } return TRUE; } // メイン関数 int main( void ) { INT nParam[ 5 ]; RECT rc; // タスクバー以外の長方形 GetMonitorRect( &rc ); nParam[ 0 ] = 0; // カウント値 nParam[ 1 ] = rc.left; // X座標 nParam[ 2 ] = rc.top; // Y座標 nParam[ 3 ] = rc.right - rc.left; // 横サイズ nParam[ 4 ] = rc.bottom - rc.top; // 縦サイズ // ウインドウの最大サイズ変更 EnumWindows( EnumWindowsProc, (LPARAM)nParam ); // サイズ変更した数の表示 printf( TEXT("\n全部で %d 個のウインドウを最大サイズにリサイズしました。\n"), nParam[0] ); return 0; }
- オーナー・ウインドウがサイズ変更スタイルを持っていなくても子ウインドウがサイズ変更スタイルを持つタイプは上記のサンプルではリサイズできません。
- このようなウインドウもリサイズするには EnumChildWindows 関数などで子ウインドウのサイズ変更スタイルも探索する必要があります。
関連記事
- ウインドウの整列
- ウインドウの最小化
- ウインドウの最大化
- 最小化ウインドウの復元
- 最大化ウインドウの復元
- すべてのウインドウの復元
- ウインドウの最大サイズ変更
※コメント投稿者のブログIDはブログ作成者のみに通知されます