Share via


主控台輸入緩衝區

每個主控台都有一個輸入緩衝區,其中包含輸入事件記錄的佇列。 當主控台的視窗具有鍵盤焦點時,控制台會將每個輸入事件格式化(例如單一按鍵、滑鼠移動或滑鼠按鈕按兩下),做為輸入記錄,放在主控台的輸入緩衝區中。

應用程式可以使用高階控制台 I/O 函式,或直接使用低階控制台輸入函式,間接存取控制台的輸入緩衝區。 高階輸入函式會篩選並處理輸入緩衝區中的數據,只傳回輸入字元數據流。 低階輸入函式可讓應用程式直接從控制台的輸入緩衝區讀取輸入記錄,或將輸入記錄放入輸入緩衝區。 若要開啟主控台輸入緩衝區的句柄,請在 CreateFile 函式的呼叫中指定 CONIN$ 值。

輸入記錄是一種結構,其中包含所發生事件類型的相關信息(鍵盤、滑鼠、視窗重設大小、焦點或功能表事件),以及事件的特定詳細數據。 INPUT_RECORD 結構中的 EventType 成員會指出記錄中所包含的事件類型。

焦點和功能表事件會放在主控台的輸入緩衝區中,供系統內部使用,應用程式應該忽略。

鍵盤事件

按下或放開任何按鍵時,會產生鍵盤事件;這包括控制鍵。 不過,ALT 鍵在按下和放開時對系統具有特殊意義,而不會與另一個字元結合,而且不會傳遞至應用程式。 此外,如果輸入句柄處於處理模式,則 CTRL+C 按鍵組合不會通過。

如果輸入事件是擊鍵,INPUT_RECORD 中的 Event 成員是包含下列資訊的KEY_EVENT_RECORD結構:

  • 布爾值,指出按鍵是否已按下或放開。
  • 當按住索引鍵時,可以大於一個的重複計數。
  • 虛擬金鑰程式代碼,以與裝置無關的方式識別指定的金鑰。
  • 虛擬掃描程式代碼,表示鍵盤硬體所產生的裝置相依值。
  • 翻譯的 Unicode™ 或 ANSI 字元。
  • 旗標變數,指出控制鍵的狀態(ALT、CTRL、SHIFT、NUM LOCK、SCROLL LOCK 和 CAPS LOCK 鍵),並指出是否已按下增強鍵。 IBM® 101 鍵和 102 鍵鍵盤的增強鍵是數位按鍵板左邊的 INS、DEL、HOME、END、PAGE UP、PAGE DOWN 和箭頭鍵。

滑鼠事件

每當用戶移動滑鼠或按下或放開其中一個滑鼠按鈕時,就會產生滑鼠事件。 只有在符合下列條件時,滑鼠事件才會放在輸入緩衝區中:

  • 主控台輸入模式設定為 ENABLE_MOUSE_INPUT (預設模式)。
  • 控制台視窗具有鍵盤焦點。
  • 滑鼠指標位於控制台視窗的框線內。

如果輸入事件是滑鼠事件,INPUT_RECORD 中的事件成員是包含下列資訊的MOUSE_EVENT_RECORD結構:

  • 滑鼠指標的座標,以控制台畫面緩衝區座標系統中的字元儲存格列和數據行而言。
  • 旗標變數,指出滑鼠按鈕的狀態。
  • 旗標變數,指出控制鍵的狀態(ALT、CTRL、SHIFT、NUM LOCK、SCROLL LOCK 和 CAPS LOCK),並指出是否已按下增強鍵。 IBM 101 鍵和 102 鍵鍵盤的增強鍵是數位按鍵板左邊的 INS、DEL、HOME、END、PAGE UP、PAGE DOWN 和箭頭鍵。
  • 旗標變數,指出事件是否為一般按鈕按下或按鈕釋放事件、滑鼠移動事件,或按兩下事件的第二次點選。

注意

滑鼠位置座標在控制台畫面緩衝區方面,而不是控制台視窗。 屏幕緩衝區可能已經捲動至視窗,因此視窗左上角不一定是控制台畫面緩衝區的 (0,0) 座標。 若要判斷滑鼠相對於視窗座標系統的座標,請從滑鼠位置座標減去視窗原點座標。 使用 GetConsoleScreenBufferInfo 函式來判斷視窗原點座標。

MOUSE_EVENT_RECORD 結構的 dwButtonState 成員有一個與每個滑鼠按鈕對應的位。 如果按鈕已關閉,則位為 1,如果按鈕已啟動,則為 0。 按鈕釋放事件是由 MOUSE_EVENT_RECORD 的 dwEventFlags 成員 0 值以及按鈕位從 1 到 0 的變更所偵測。 GetNumberOfConsoleMouseButtons 函式會擷取滑鼠上的按鈕數目。

緩衝區重設大小事件

主控台視窗的功能表可讓用戶變更使用中畫面緩衝區的大小;這項變更會產生緩衝區重設大小事件。 如果主控台的輸入模式設定為 ENABLE_WINDOW_INPUT ,則會將緩衝區大小調整事件放在輸入緩衝區中(也就是已停用預設模式)。

如果輸入事件是緩衝區重設大小事件,則 INPUT_RECORD 的 Event 成員是包含控制台畫面緩衝區新大小的WINDOW_BUFFER_SIZE_RECORD結構,以字元數據格數據行和數據列表示。

如果用戶減少控制台畫面緩衝區的大小,則會遺失緩衝區捨棄部分的任何數據。

由於應用程式呼叫 SetConsoleScreenBufferSize 函式,控制台畫面緩衝區大小的變更不會產生為緩衝區重設大小事件。