アークピットのホームページに戻る

WinAPIトピックのトップページに戻る

APIトピックの各章に移動する

ダウンロードのページに移動する
ダウンロードができ
ない場合の対処法
 

ページ移動

2-2-14. あるウィンドウをアクティブにしない方法

 ウィンドウには、アクティブな状態が存在します。そのアクティブな状態になっているウィンドウをアクティブウィンドウと言います。

アクティブウィンドウ

 アクティブウィンドウとは、ユーザーが現在作業をしているアプリケーションのトップレベルウィンドウのことです。アクティブウィンドウであることをユーザーが容易に識別できるようにするため、Windowsはそのウィンドウをいちばん手前に表示させ、ウィンドウのタイトルバーと境界をシステム定義のアクティブウィンドウの色に変更します。アクティブウィンドウにできるのはトップレベルウィンドウだけです。ユーザが子ウィンドウで作業をしているときには、その子ウィンドウのトップレベルの親ウィンドウをアクティブ化します。

 ある時点において、システム内でアクティブなトップレベルウィンドウは1つだけです。ユーザーはトップレベルウィンドウ(またはその子ウィンドウの1つ)をクリックするか、[Alt]+[Esc]キーか、[Alt]+[Tab]キーを押すことにより、ウィンドウをアクティブ化します。アプリケーションからは、SetActiveWindow関数を呼び出してトップレベルウィンドウをアクティブ化します。この関数のほか、SetWindowPosやDeferWindowPos、SetWindowPlacement、DestroyWindowなどの多くの関数により、種々のトップレベルウィンドウをWindowsにアクティブ化させることができます。

SetActiveWindow 関数と SetForegroundWindow 関数

 SetActiveWindow のAPI は、指定ウィンドウをアクティブにしますが、使用には注意をしないといけません。また、SetForegroundWindow 関数は、指定したウィンドウを前面に配置します。もし、SetActiveWindow するウィンドウが同じスレッドにある場合は、SetForegroundWindow 動作だけ行ないます。

WM_NCACTIVATE メッセージでアクティブ化を制御

 このメッセージは、アクティブ状態が変化する時に起こります。まず、アクティブで無くなるウィンドウに wParama に FALSE の値でメッセージを発行します。そして、そのメッセージの返り値が、TRUE なら、新しくアクティブになるウィンドウに、wParama に TRUE の値でメッセージを発行します。もし非アクティブ化されるウィンドウの、WM_NCACTIVATE メッセージが、FALSE を返したら、システムは、アクティブ状態は変わらないと判断し、それ以後の作業を中止します。

 よって、もし故意に非アクティブになりたくない場合は、以下のコードの様に、WM_NCACTIVATE メッセージで、FALSE を返します。ただし他のアプリケーションに迷惑をかけるので、余程の理由が無い限り行なわない方が良いでしょう。

        case WM_NCACTIVATE:
        {
            if ((BOOL)wParam == FALSE) // 非アクティブ化される
            {
                if (何らかの条件)
                    return FALSE;      // 非アクティブ化の拒否
            }
            break;                     // それ以外は通常の処理
        }

ページ移動