コンソールの作成

コンソール プロセス (エントリ ポイントが main 関数であるキャラクターモード プロセス) が開始されるときに、システムによって新しいコンソールが作成されます。 たとえば、コマンド プロセッサ cmd.exe の起動時に、システムによって新しいコンソールが作成されます。 コマンド プロセッサで新しいコンソール プロセスが開始されるとき、ユーザーは、新しいプロセス用の新しいコンソールを作成するか、コマンド プロセッサのコンソールを継承するかを指定できます。

プロセスでは、次のいずれかの方法を使用して、コンソールを作成できます。

  • グラフィカル ユーザー インターフェイス (GUI) またはコンソール プロセスでは、CreateProcess 関数を CREATE_NEW_CONSOLE を指定して使用して、新しいコンソールを使用するコンソール プロセスを作成できます。 (既定では、コンソール プロセスでは親コンソールが継承され、意図されたプロセスによって入力が受信される保証はありません)。
  • 現在コンソールにアタッチされていない GUI またはコンソール プロセスでは、AllocConsole 関数を使用して、新しいコンソールを作成できます (GUI プロセスは、作成時にコンソールにアタッチされません。コンソール プロセスは、CreateProcessDETACHED_PROCESS を使用して作成される場合はコンソールにアタッチされません)。

通常、プロセスでは、ユーザーとの対話を必要とするエラーが発生したときに、AllocConsole を使用してコンソールを作成します。 たとえば、GUI プロセスでは、通常のグラフィック インターフェイスの使用を妨げるエラーが発生したときにコンソールを作成でき、通常はユーザーと対話しないコンソール プロセスでは、エラーを表示するためのコンソールを作成できます。

プロセスでは、CreateProcess の呼び出しで CREATE_NEW_CONSOLE フラグを指定することによって、コンソールを作成することもできます。 この方法では、子プロセスにはアクセスできるが親プロセスにはアクセスできない新しいコンソールが作成されます。 コンソールを分けることで、親プロセスと子プロセスの両方が、競合することなくユーザーと対話することができます。 コンソール プロセスの作成時にこのフラグが指定されていない場合、両方のプロセスが同じコンソールにアタッチされ、正しいプロセスによって、それに意図された入力が受信される保証はありません。 アプリケーションでは、入力バッファー ハンドルを継承しない子プロセスを作成するか、入力バッファー ハンドルを継承する子プロセスを一度に 1 つだけ有効にして、子が終了するまで親プロセスでコンソールの入力を読み取れないようにすることで、混乱を防ぐことができます。

新しいコンソールを作成すると、新しいコンソール ウィンドウと、個別の I/O バッファーが、画面への出力ユーザーからの入力用に生成されます。 新しいコンソールに関連付けられたプロセスでは、GetStdHandle 関数を使用して、新しいコンソールの入力バッファーと画面バッファーのハンドルを取得します。 プロセスは、これらのハンドルによって、コンソールにアクセスできるようになります。

CreateProcess が使用される場合、子プロセス用に作成される最初の新しいコンソールの特性 (存在する場合) をメンバーが制御する STARTUPINFO 構造体を指定できます。 CreateProcess の呼び出しに指定された STARTUPINFO 構造体は、 CREATE_NEW_CONSOLE フラグが指定されている場合に作成されるコンソールに影響します。 子プロセスで AllocConsole が使用される場合に作成されるコンソールにも影響します。 次のコンソールの特性を指定できます。

  • 文字セル内の新しいコンソール ウィンドウのサイズ
  • 画面ピクセル座標での新しいコンソール ウィンドウの場所
  • 文字セル内の新しいコンソールの画面バッファーのサイズ
  • 新しいコンソールの画面バッファーのテキストと背景色の属性
  • 新しいコンソールのウィンドウのタイトル バーの表示名

STARTUPINFO 値が指定されていない場合、システムでは既定値が使用されます。 子プロセスでは、GetStartupInfo 関数を使用して、その STARTUPINFO 構造体の値を確認できます。

プロセスでは、画面上のコンソール ウィンドウの場所を変更することはできませんが、次のコンソール関数を使用して、STARTUPINFO 構造体に指定されたその他のプロパティを設定または取得できます。

関数 説明
GetConsoleScreenBufferInfo ウィンドウ サイズ、画面バッファー サイズ、およびカラー属性を取得します。
SetConsoleWindowInfo コンソール ウィンドウのサイズを変更します。
SetConsoleScreenBufferSize コンソールの画面バッファーのサイズを変更します。
SetConsoleTextAttribute 色の属性を設定します。
SetConsoleTitle コンソール ウィンドウのタイトルを設定します。
GetConsoleTitle コンソール ウィンドウのタイトルを取得します。

プロセスでは、FreeConsole 関数を使用して、継承されたコンソールから、または AllocConsole によって作成されたコンソールから自身をデタッチできます。

プロセスでは、FreeConsole を使用して自身のセッションからデタッチした後 (またはアタッチされているセッションがない場合)、AttachConsole 関数を使用して、自身を別の既存のコンソール セッションにアタッチできます。