ウィンドウの状態
ウィンドウの表示状態
ウィンドウの表示状態は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を返す。
第二引数bEnable
にTRUE
を設定すると有効になり、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
を指定すると最初の子ウィンドウから検索されます。
hWndParent
とhwndChildAfter
の両方がNULL
の場合、すべてのトップレベルウィンドウとメッセージウィンドウが検索対象になります。
第三、第四引数はFindWindow関数とほぼ同じです。
第三引数lpszClass
は自分で定義したクラス名(やATOM値)のほか、システムクラス(BUTTON
とかEDIT
とか)を指定することができます。
また、MAKEINTATOM(0x8000)
という特殊な値を指定することもできます。
FindWindowEx(NULL, NULL, MAKEINTATOM(0x8000), NULL);
これはメニュークラスのアトムを意味し、メニューが表示されているか否かをチェックできます。
第四引数は子ウィンドウに表示されている文字列です。
タイトルを持たないウィンドウの場合はNULL
を指定します。