控制臺管理字符模式程序的輸入和輸出(程序不需要提供他們自己的圖形用戶界面)。
控制臺函數使訪問不同級別的控制臺成為可能。高級控制臺
I/O
函數使程序可以從標準輸入來重新得到存儲在控制臺輸入緩沖區中的鍵盤輸入;這些函數也能夠是程序可以向標準輸出寫或將錯誤顯示在標準的控制臺緩沖區中。高級別的控制臺函數也支持重定向標準的句柄和不同
I/O
功能的控制臺模式。低級別的
I/O
函數能夠使程序接收詳細的鍵盤輸入和鼠標事件,以及控制臺窗口和用戶交互的事件。低級函數也是輸出到屏幕較大的控制。
控制臺對簡單字符模式程序提供高級的支持,其通過讀寫標準輸入和輸出以及標準錯誤函數來和用戶交互。控制臺也提供復雜低級支持,例如:直接訪問控制臺屏幕緩沖區以及接收額外輸入信息(例如鼠標輸入)。
什么是控制臺?
控制臺是一個用來提供字符模式
I/O
的接口。這種處理器獨立的機制使導入一個存在的字符模式程序或創建一個新的字符模式工具和程序變的容易。
控制由輸入緩沖區和一到多哥屏幕緩沖區組成。輸入緩沖區包含一個輸入記錄的序列,序列中是輸入事件的信息。輸入隊列也包含鍵按下和松開鍵事件。它也能包括鼠標事件(指針移動和鼠標鍵按下或釋放)以及用來影響活動屏幕區域大小的用戶動作。屏幕緩沖區是一個控制臺窗口的二維的字符數組和彩色數據。所有的處理能共享一個控制臺。
系統在啟動一個控制臺程序的時候創建一個控制臺,控制臺程序是一個字符模式的程序,入口是
main
函數。例如,系統在其他命令處理器是會創建一個新的控制臺。當命令處理器開始一個新的控制臺程序時,用戶能指定系統是否為新的程序創建一個新的控制臺還是從命令處理器控制臺繼承。
一個程序可以使用下面的方法來創建一個控制臺:
1.?
GUI
或控制臺程序可以使用
CreateProcess
函數并帶有
CREATE_NEW_CONSOLE
來創建一個帶有新控制臺的控制臺程序。(默認的,控制臺程序從它的父控制臺中繼承并且不能保證輸出可以被程序接收)
2.?
GUI
或控制臺進程沒有附著到一個控制臺上的,可以使用
AllocConsole
函數來創建一個新的控制臺(
GUI
程序在創建的時候不附著到控制臺上,控制臺進程在使用
DETACHED_PROCESS
標志的
CreateProcess
函數創建的時候也不附著到控制臺上。
典型的情況,一個程序在錯誤發生并請求用戶交互的時候使用
AllocConsole
來創建一個控制臺。例如,一個
GUI
程序在阻止使用正常圖形接口程序錯誤發生的時候能創建一個控制臺,或一個控制臺進程沒有正常地和用戶交互可以創建一個控制臺來顯示錯誤。
進程可以在調用
CreateProcess
的時候指定
CREATE_NEW_COSOLE
標志來創建一個控制臺。這個方法創建一個控制對子進程可訪問,而對父進程不可訪問。獨立的控制臺對于是父子進程與用戶不沖突的交互成為可能。如果這個標志在一個控制臺進程創建的時候沒有指定,兩個進程都附著到相同的控制臺上,并且不能保證正確的進程能接收到提供給他的輸入。程序可以在創建子進程的時候不繼承輸入緩沖區的句柄來避免這種迷惑的情況,或者同時只有一個子進程繼承輸入緩沖區句柄來組織父親進程在子進程沒有完成的時候讀控制臺輸入。
創建一個新的控制臺結果是一個新的控制臺窗口,同時也包括獨立的屏幕緩沖區。和新控制臺關聯的進程可以使用
GetStdHandle
函數來得到新的控制臺輸入和屏幕緩沖區的句柄。這些句柄使進程可以訪問控制臺。
當一個進程使用
CreateProcess
,它可以指定一個
STARTUPINFO
結構,該結構的成員控制為子進程創建的第一個新控制臺的特性。如果
CREATE_NEW_CONSOLE
標志被指定,
STARTUPINFO
結構在調用
CreateProcess
時候影響一個控制臺的創建;它也影響子進程后來使用
AllocConsole
來創建控制臺。下面的控制臺特性可以指定:
1.?
新控制臺窗口的大小,字符單元
2.?
新控制臺窗口的位置,屏幕像素坐標
3.?
新控制臺屏幕緩沖區的文本和背景顏色屬性
4.?
新控制臺窗口的
TITLE BAR
上的顯示名字
如果
STARTUPINFO
值沒有指定,系統使用默認的值。子進程可以使用
GetStartupInfo
函數來判斷
STARTUPINFO
結構中的值。
進程不能改變控制臺窗口在屏幕上的位置,但下面的控制臺函數可以用來設置和獲得
STARTUPINFO
結構的其他屬性。
進程可以使用
FreeConsole
函數來分離繼承的控制臺或通過
AllocConsole
創建的控制臺。