ウィンドウの状態

ウィンドウの表示状態

ウィンドウの表示状態はShowWindow関数で設定します。

BOOL ShowWindow(
 HWND hWnd,
 int nCmdShow
);
ウィンドウhWndの表示状態をnCmdShowに設定する。
戻り値は関数実行前にウィンドウが表示されていた場合は0以外を返す。
非表示状態であった場合は0を返す。

第二引数nCmdShowには以下の定数のいずれかを指定します。
なお「アクティブ」とはウィンドウがキー入力を受け付ける状態のことです。
アクティブウィンドウは通常は最も手前に表示されていますが、別のウィンドウの状態によっては最前面ではないこともあります。

定数 説明
SW_HIDE ウィンドウを非表示にする。
ウィンドウがアクティブであった場合は別のウィンドウがアクティブになる。
SW_SHOWNORMAL
SW_NORMAL
ウィンドウを通常状態で表示しアクティブにする。
通常状態とは最大化/最小化でない状態。
ウィンドウが初めて表示される時はこのフラグを指定する。
SW_SHOWMINIMIZED ウィンドウを最小化しアクティブにする。
SW_SHOWMAXIMIZED
SW_MAXIMIZE
ウィンドウを最大化しアクティブにする。
SW_SHOWNOACTIVATE ウィンドウを通常状態で表示する。
アクティブにはしない。
SW_SHOW ウィンドウを表示しアクティブにする。
最小化/最大化の状態は変更しない。
SW_MINIMIZE ウィンドウを最小化する。
ウィンドウがアクティブであった場合は別のウィンドウがアクティブになる。
SW_SHOWMINNOACTIVE ウィンドウを最小化する。
アクティブウィンドウは変更しない。
SW_SHOWNA ウィンドウを表示する。
最小化/最大化の状態およびアクティブウィンドウは変更しない。
SW_RESTORE ウィンドウを通常状態で表示しアクティブにする。
最小化ウィンドウを元に戻す時はこのフラグを指定する。
SW_SHOWDEFAULT アプリケーションが外部プログラムから起動された場合に、CreateProcess関数に渡されるSTARTUPINFO構造体で指定された状態に基づいて表示する。
SW_FORCEMINIMIZE ウィンドウを所有するスレッドが応答しない場合でもウィンドウを最小化する。
このフラグは別スレッドからウィンドウを最小化する場合にのみ使用する。

可視状態の判別

ウィンドウが表示中か否かはIsWindowVisible関数で判別できます。

BOOL IsWindowVisible(
 HWND hWnd
);
ウィンドウhWndが可視状態ならば0以外を返す。
非表示状態ならば0を返す。

可視状態はプログラム上でそのウィンドウが表示されているか否かで判断されます。
(WS_VISIBLEスタイルを持つウィンドウ)
指定のウィンドウが別のウィンドウで隠されている場合でもそれは表示状態と判断されます。
最小化状態でも表示中になります。

親ウィンドウが非表示状態の場合、子ウィンドウは自身の状態にかかわらず非表示状態となります。

最小化/最大化状態の判別

ウィンドウが最小化されているかの判別にはIsIconic関数を使用します。
ウィンドウが最大化されているかの判別にはIsZoomed関数を使用します。

BOOL IsIconic(
 HWND hWnd
);
ウィンドウhWndが最小化されていれば0以外を返す。
最小化されていなければ0を返す。
BOOL IsZoomed(
 HWND hWnd
);
ウィンドウhWndが最大化されていれば0以外を返す。
最小化されていなければ0を返す。

IsWindowVisible関数が真、かつIsIconic関数およびIsZoomed関数が偽になるとき、ウィンドウは通常状態で表示されていることになります。

無効なウィンドウ

ウィンドウは無効状態にすることができます。
無効状態のウィンドウは画面上には表示されますが、マウスやキーボードからの入力を受け付けなくなります。

無効状態のウィンドウはCreateWindow関数のウィンドウスタイルにWS_DISABLEDを指定することで作成できます。
プログラムの実行中にウィンドウの有効/無効を切り替えるにはEnableWindow関数を使用します。

BOOL EnableWindow(
 HWND hWnd,
 BOOL bEnable
);
ウィンドウhWndの有効状態をbEnableに設定する。
戻り値は関数実行前にウィンドウが無効であった場合は0以外を返す。
有効であった場合は0を返す。

第二引数bEnableTRUEを設定すると有効になり、FALSEを設定すると無効になります。

コントロールを無効にすると灰色がかった表示になります。
(ウィンドウを無効にしても外見に変化はありません)
無効状態のコントロールの表示

無効状態のウィンドウはマウスやキーボードで操作できませんが、停止しているわけではありません。
SendMessage関数などでプログラム上から操作することは可能です。

無効状態の判別

ウィンドウが有効か無効かを判断するにはIsWindowEnabled関数を使用します。

BOOL IsWindowEnabled(
 HWND hWnd
);
ウィンドウhWndが有効なら0以外を返す。
無効なら0を返す。

アクティブ状態

アクティブウィンドウの取得

現在のスレッドでのアクティブウィンドウのハンドルを取得するにはGetActiveWindow関数を使用します。

HWND GetActiveWindow();
この関数を呼び出したスレッドが持つアクティブウィンドウを取得する。
無ければNULLを返す。

この関数を実行したスレッドが持っているウィンドウのうち、アクティブウィンドウがあればそのウィンドウハンドルを返します。
無ければNULLが返ります。

アクティブウィンドウはWindowsシステム上にひとつだけ存在します。
別のアプリがアクティブウィンドウを持っている場合はこの関数はNULLを返します。
また、同じアプリ内でもマルチスレッドである場合、別のスレッドでウィンドウを管理している場合もNULLが返されます。

フォアグラウンドウィンドウの取得

全てのアプリを含めたアクティブウィンドウを取得するにはGetForegroundWindow関数を使用します。

HWND GetForegroundWindow();
フォアグラウンドウィンドウのハンドルを返す。

フォアグラウンドとは前面という意味ですが、ここではユーザーの操作対象になっているウィンドウという意味で、アクティブウィンドウと同じ意味です。
GetActiveWindow関数とは違い現在実行中のすべてのアプリが対象になります。

Windowsではどのウィンドウよりも常に最前面に表示するウィンドウを作ることもできますが、GetForegroundWindow関数は最前面ウィンドウではなくユーザーの操作対象になっているウィンドウのハンドルを返します。

なお、Windows上にアクティブウィンドウはひとつ存在しますが、関数実行のタイミングによってはNULLを返すこともあります。

アクティブウィンドウの設定

現在のスレッドのウィンドウをアクティブにするにはSetActiveWindow関数を使用します。

HWND SetActiveWindow(
 HWND hWnd
);
ウィンドウhWndをアクティブにする。
戻り値は関数の実行前にアクティブだったウィンドウのハンドル。
関数が失敗した場合はNULLを返す。

この関数は呼び出し元のスレッドが持つウィンドウをアクティブにすることができます。
別のスレッドが持つウィンドウをアクティブにすることはできません。

フォアグラウンドウィンドウの設定

全てのアプリを含めたウィンドウをアクティブに設定するにはSetForegroundWindow関数を使用します。

BOOL SetForegroundWindow(
 HWND hWnd
);
ウィンドウhWndをフォアグラウンドウィンドウに設定する。
成功した場合は0以外を、失敗した場合は0を返す。

ウィンドウの存在

有効なウィンドウハンドル

有効なウィンドウハンドルか否かを判別するにはIsWindow関数を使用します。

BOOL IsWindow(
 HWND hWnd
);
ウィンドウハンドルhWndのウィンドウが存在する場合は0以外を返す。
存在しない場合は0を返す。

この関数は別スレッドで作成されたウィンドウに対しては正しく動作しない可能性があります。
また、指定のウィンドウが破棄された後、たまたま同じハンドルに別のウィンドウハンドルが格納されることもあり得ます。
(ウィンドウハンドルは整数値で管理しているため、同じ番号が使われる可能性がある)

ウィンドウの検索

クラス名とウィンドウタイトルによってウィンドウを検索するにはFindWindow関数を使用します。

HWND FindWindowW(
 LPCWSTR lpClassName,
 LPCWSTR lpWindowName
);
ウィンドウクラスlpClassName、ウィンドウタイトルlpWindowNameで識別されるウィンドウのハンドルを返す。
失敗した場合はNULLを返す。

この関数はトップレベルウィンドウのみを検索します。
つまりコントロールなどの子ウィンドウは検索されません。
また、大文字小文字は区別されません。

第一引数lpClassNameはクラス名の文字列のほか、RegisterClass関数(RegisterClassEx関数)の戻り値であるATOM値を指定することもできます。
ATOMを指定する場合はMAKEINTATOMマクロを使用します。


h = FindWindow(MAKEINTATOM(atom), NULL);

第二引数lpWindowNameはウィンドウのタイトルバーに表示されるタイトルです。

これらの引数はNULLを指定することもでき、どちらか一方のみに一致するウィンドウを検索することもできます。
(両方をNULLにすると全てのウィンドウに一致します)

子ウィンドウの検索

クラス名とウィンドウタイトルによって子ウィンドウを検索するにはFindWindowEx関数を使用します。

HWND FindWindowExW(
 HWND hWndParent,
 HWND hWndChildAfter,
 LPCWSTR lpszClass,
 LPCWSTR lpszWindow
);
ウィンドウhWndParent内の子ウィンドウから、ウィンドウクラスlpClassName、ウィンドウタイトルlpWindowNameで識別されるウィンドウのハンドルを返す。
検索は子ウィンドウhWndChildAfterの次のウィンドウから開始される。
失敗した場合はNULLを返す。

この関数も大文字小文字は区別しません。

第一引数hWndParentは検索対象となる親ウィンドウのハンドルです。
検索されるのはこの親ウィンドウの直接の子ウィンドウのみで、子ウィンドウ内の子ウィンドウ(子孫ウィンドウ)は検索しません。
NULLを指定するとデスクトップが親となります。
HWND_MESSAGEという定数を指定するとメッセージウィンドウのみを検索対象にします。
(メッセージウィンドウについてはここでは説明しません)

第二引数hWndChildAfterは検索を開始する子ウィンドウのハンドルです。
この子ウィンドウの次のZオーダーとなる子ウィンドウから検索対象となります。
NULLを指定すると最初の子ウィンドウから検索されます。

hWndParenthwndChildAfterの両方がNULLの場合、すべてのトップレベルウィンドウとメッセージウィンドウが検索対象になります。

第三、第四引数はFindWindow関数とほぼ同じです。
第三引数lpszClassは自分で定義したクラス名(やATOM値)のほか、システムクラス(BUTTONとかEDITとか)を指定することができます。
また、MAKEINTATOM(0x8000)という特殊な値を指定することもできます。


FindWindowEx(NULL, NULL, MAKEINTATOM(0x8000), NULL);

これはメニュークラスのアトムを意味し、メニューが表示されているか否かをチェックできます。

第四引数は子ウィンドウに表示されている文字列です。
タイトルを持たないウィンドウの場合はNULLを指定します。