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