Windowsでは、フォアグラウンドウィンドウとアクティブウィンドウの違いは何ですか?具体的には、どのような状況でフォアグラウンドウィンドウがアクティブウィンドウにならないのですか? 2つの用語が同じ概念を参照している場合、2つの用語があるのはなぜですか。
ここのmsdnドキュメントでは、「ウィンドウをクリックするか、 ALT+TAB または ALT+ESC キーの組み合わせ」は、ウィンドウをフォアグラウンドだけでなくアクティブにします。2つの用語の違いについては明確に何もありません。チェック [〜#〜] msdn [〜#〜] 。
アクティブなウィンドウ(GetActiveWindow()
の結果)は、入力を取得するウィンドウ呼び出しスレッドにアタッチされているです。フォアグラウンドウィンドウ(GetForegroundWindow()
の結果)は、呼び出しスレッドとの関係に関係なく、現在入力を取得しているウィンドウです。アクティブウィンドウは基本的にアプリケーションにローカライズされています。フォアグラウンドウィンドウはシステム全体に適用されます。
たとえば、別のプロセスに属するウィンドウが前面にある場合、独自のプロセス内からGetActiveWindow()
を呼び出すと、NULL
が返されます。
フォアグラウンドウィンドウであることはアクティブウィンドウであることを意味するのは事実ですが、その逆は当てはまりません。また、最近のWindowsでは、アプリケーションは一般にSetForegroundWindow()
を使用して別のプロセスからフォーカスを盗むことができないことに注意してください(そのプロセスがAllowSetForegroundWindow
を介して明示的に許可を与えている場合を除く)。
MSDNの説明も少しわかりにくいのですが、これが私の改訂されたテイクです。
まず、フォアグラウンドウィンドウとバックグラウンドウィンドウはアクティブウィンドウとは関係なく、スレッドと関係があります。以下を参照してください。そのため、アクティブウィンドウとしてバックグラウンドウィンドウを使用することは技術的には可能ですが、混乱を招き、システムがこれを行わないため、代わりにアプリで呼び出す必要があります。 SetWindowPosは、背景ウィンドウをアクティブにします。
システムは一度に1つのアクティブなトップレベルウィンドウしか持つことができません。子ウィンドウで作業している場合、システムはトップレベルウィンドウをアクティブにします。すべての入力はアクティブなウィンドウに送られ、通常は子ウィンドウに渡されます。
/----------------------\
| |
| FOREGROUND WINDOW |--\
| | |
\----------------------/ |
| BACKGROUND WINDOW |
\-----------------------/
/----------------------\
| |
| ACTIVE WINDOW |--\
| | |
\----------------------/ |
| BACKGROUND WINDOW |
\-----------------------/
MSDNから
アクティブウィンドウ
アクティブウィンドウは、ユーザーが現在使用しているアプリケーションの最上位ウィンドウです。ユーザーがアクティブウィンドウを簡単に識別できるようにするために、システムはウィンドウをzオーダーの一番上に配置し、タイトルバーと境界線の色をシステム定義のアクティブウィンドウの色に変更します。トップレベルのウィンドウのみがアクティブウィンドウになれます。ユーザーが子ウィンドウで作業しているとき、システムは子ウィンドウに関連付けられている最上位の親ウィンドウをアクティブにします。
前景/背景
各プロセスは複数の実行スレッドを持つことができ、各スレッドはウィンドウを作成できます。ユーザーが現在作業しているウィンドウを作成したスレッドはフォアグラウンドスレッドと呼ばれ、ウィンドウはフォアグラウンドウィンドウと呼ばれます。他のすべてのスレッドはバックグラウンドスレッドであり、バックグラウンドスレッドによって作成されたウィンドウはバックグラウンドウィンドウと呼ばれます。