控制台管理字符模式程序的输入和输出(程序不需要提供他们自己的图形用户界面)。
控制台函数使访问不同级别的控制台成为可能。高级控制台
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
创建的控制台。