最大化ウインドウをすべて復元するには可視ウインドウを検索して次のようにします。(戻る)
- 可視ウインドウか調べる(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_RESTORE ); } } } } } return TRUE; } // メイン関数 int main( void ) { INT nCount = 0; // 最大化ウインドウの復元 EnumWindows( EnumWindowsProc, (LPARAM)&nCount ); // 復元した数の表示 printf( TEXT("\n全部で %d 個の最大化ウインドウを復元しました。\n"), nCount ); return 0; }
- オーナー・ウインドウが最大化スタイルを持っていなくても子ウインドウが最大化スタイルを持つタイプは上記のサンプルでは復元できません。
- このようなウインドウも復元するには EnumChildWindows 関数などで子ウインドウの最大化スタイルも探索する必要があります。
関連記事
- ウインドウの整列
- ウインドウの最小化
- ウインドウの最大化
- 最小化ウインドウの復元
- 最大化ウインドウの復元
- すべてのウインドウの復元
- ウインドウの最大サイズ変更
※コメント投稿者のブログIDはブログ作成者のみに通知されます