コンソールの入力バッファー

各コンソールには、入力イベント レコードのキューを含む入力バッファーがあります。 コンソールのウィンドウにキーボード フォーカスがある場合、コンソールは各入力イベント (1 回のキーボード操作、マウスの動き、マウスボタンのクリックなど) を、コンソールの入力バッファーに配置する入力レコードとして書式設定します。

アプリケーションは、高レベルのコンソール I/O 関数を使用するか、低レベルのコンソール入力関数を使用して直接、コンソールの入力バッファーに間接的にアクセスできます。 高レベルの入力関数は、入力バッファー内のデータをフィルタリングして処理し、入力文字のストリームのみを返します。 低レベルの入力関数を使用すると、アプリケーションはコンソールの入力バッファーから直接入力レコードを読み取ったり、入力レコードを入力バッファーに配置したりできます。 コンソールの入力バッファーへのハンドルを開くには、CreateFile 関数の呼び出しで CONIN$ 値を指定します。

入力レコードは、発生したイベントの種類 (キーボード、マウス、ウィンドウのサイズ変更、フォーカス、またはメニュー イベント) に関する情報と、イベントに関する特定の詳細を含む構造体です。 INPUT_RECORD 構造体の EventType メンバーは、レコードに含まれるイベントの種類を示します。

フォーカス イベントとメニュー イベントは、システムで内部使用するためにコンソールの入力バッファーに配置され、アプリケーションでは無視する必要があります。

キーボード イベント

キーボード イベントは、キーが押されたり離されたりしたときに生成されます。これには制御キーが含まれます。 ただし、Alt キーは、別の文字と組み合わされずに押されて離されたときにシステムに特別な意味を持ち、アプリケーションに渡されません。 また、入力ハンドルが処理されたモードの場合、Ctrl+C のキーの組み合わせは渡されません。

入力イベントがキーボード操作の場合、INPUT_RECORDEvent メンバーは、次の情報を含む KEY_EVENT_RECORD 構造体です。

  • キーが押されたか離されたかを示すブール値。
  • キーが押された場合に 1 より大きくなる可能性がある繰り返し回数。
  • デバイスに依存しない方法で指定されたキーを識別する仮想キー コード。
  • キーボード ハードウェアによって生成されるデバイス依存の値を示す仮想スキャン コード。
  • 変換された Unicode™ または ANSI 文字。
  • 制御キー (Alt、Ctrl、Shift、NUM LOCK、SCROLL LOCK、CapsLock の各キー) の状態を示し、拡張キーが押されたかどうかを示すフラグ変数。 IBM® 101 キー および 102 キーの キーボードの拡張キーは、数値キーパッドの左側にあるクラスター内の INS、DEL、HOME、END、PAGE UP、PAGE DOWN、および方向キー、およびテンキーの除算 (/) キーと Enter キーです。

マウス イベント

マウス イベントは、ユーザーがマウスを動かすか、マウス ボタンの 1 つを押すか離すたびに生成されます。 マウス イベントは、次の条件が満たされた場合にのみ入力バッファーに配置されます。

  • コンソール入力モードは、ENABLE_MOUSE_INPUT(デフォルトのモード) に設定されます。
  • コンソール ウィンドウにはキーボード フォーカスがあります。
  • マウス ポインターは、コンソールのウィンドウの境界線内にあります。

入力イベントがマウス イベントの場合、INPUT_RECORDEvent メンバーは、次の情報を含む MOUSE_EVENT_RECORD 構造体です。

  • コンソール スクリーン バッファーの座標系内の文字セルの行と列に関するマウス ポインターの座標。
  • マウス ボタンの状態を示すフラグ変数。
  • 制御キー (Alt、Ctrl、Shift、NUM LOCK、SCROLL LOCK、CapsLock) の状態を示し、拡張キーが押されたかどうかを示すフラグ変数。 IBM 101 キーおよび 102 キーのキーボードの拡張キーは、数値キーパッドの左側にあるクラスター内の INS、DEL、HOME、END、PAGE UP、PAGE DOWN、および方向キー、およびテンキーの除算 (/) キーと Enter キーです。
  • イベントが通常のボタン押下イベントかボタン解放イベントか、マウス移動イベントか、ダブルクリック イベントの 2 回目のクリックかを示すフラグ変数。

Note

マウスの位置座標は、コンソール ウィンドウではなく、コンソールスクリーン バッファーに関する値です。 スクリーン バッファーはウィンドウに対してスクロールされている可能性があるため、ウィンドウの左上隅が必ずしもコンソール スクリーン バッファーの (0,0) 座標であるとは限りません。 ウィンドウの座標系に対するマウスの座標を決定するには、マウス位置の座標からウィンドウの原点座標を減算します。 GetConsoleScreenBufferInfo 関数を使用して、ウィンドウの原点座標を決定します。

MOUSE_EVENT_RECORD 構造体の dwButtonState メンバーには、各マウス ボタンに対応するビットがあります。 ボタンが下にある場合はビットは 1、ボタンが上にある場合は 0 です。 ボタン解放イベントは、MOUSE_EVENT_RECORDdwEventFlags メンバーの 0 値とボタンのビットの 1 から 0 への変更によって検出されます。 GetNumberOfConsoleMouseButtons 関数は、マウスのボタンの数を取得します。

バッファー サイズ変更イベント

コンソール ウィンドウのメニューを使用すると、ユーザーはアクティブなスクリーン バッファーのサイズを変更できます。この変更により、バッファー サイズ変更イベントが生成されます。 コンソールの入力モードが ENABLE_WINDOW_INPUT(つまり、デフォルトのモードが無効) に設定されている場合、バッファー サイズ変更イベントは入力バッファーに配置されます。

入力イベントがバッファー サイズ変更イベントの場合、INPUT_RECORDEvent メンバーは、コンソール スクリーン バッファーの新しいサイズを含む WINDOW_BUFFER_SIZE_RECORD 構造体であり、文字セルの列と行で表されます。

ユーザーがコンソール スクリーン バッファーのサイズを小さくすると、バッファーのディスカードされた部分内のすべてのデータが失われます。

SetConsoleScreenBufferSize 関数へのアプリケーション呼び出しの結果としてのコンソール スクリーン バッファー サイズの変更は、バッファー サイズ変更イベントとして生成されません。