ウィンドウ ステーションへの接続を処理する

プロセスは、最初に USER32 または GDI32 関数 (ウィンドウ ステーションおよびデスクトップ関数以外) を呼び出すときに、ウィンドウ ステーションとデスクトップへの接続を自動的に確立します。 次の規則に従って、プロセスが接続するウィンドウステーションが決定されます。

  1. プロセスが SetProcessWindowStation 関数を呼び出した場合、その呼び出しで指定されたウィンドウ ステーションに接続します。
  2. プロセスが SetProcessWindowStation を呼び出さなかった場合は、親プロセスから継承されたウィンドウ ステーションに接続します。
  3. プロセスが SetProcessWindowStation を呼び出せず、ウィンドウ ステーションを継承しなかった場合、システムはMAXIMUM_ALLOWEDアクセスを開き、次のようにウィンドウ ステーションに接続しようとします。
    • プロセスの作成時に使用された STARTUPINFO 構造体の lpDesktop メンバーにウィンドウ ステーション名が指定されている場合、プロセスは指定されたウィンドウ ステーションに接続します。
    • それ以外の場合、プロセスが対話型ユーザーのログオン セッションで実行されている場合、プロセスは対話型ウィンドウ ステーションに接続します。
    • プロセスが非対話型ログオン セッションで実行されている場合は、ログオン セッション識別子に基づいてウィンドウ ステーション名が形成され、そのウィンドウ ステーションを開こうとします。 このウィンドウ ステーションが存在しないために開いている操作が失敗した場合、システムはウィンドウ ステーションと既定のデスクトップの作成を試みます。

この接続プロセス中に割り当てられたウィンドウ ステーションは、 CloseWindowStation 関数を呼び出して閉じることができません。

プロセスがウィンドウ ステーションに接続している場合、システムはプロセスのハンドル テーブルで継承されたハンドルを検索します。 システムは、検出された最初のウィンドウ ステーション ハンドルを使用します。 子プロセスが特定の継承されたウィンドウ ステーションに接続する場合は、目的のハンドルのみが継承可能とマークされていることを確認する必要があります。 子プロセスが複数のウィンドウ ステーション ハンドルを継承する場合、ウィンドウ ステーション接続の結果は未定義になります。

プロセスをウィンドウ ステーションに接続しているときにシステムが開くウィンドウ ステーションへのハンドルは継承できません。

デスクトップへのスレッド接続