控制台进程使用句柄来访问其控制台的输入和屏幕缓冲区。一个进程可以使用GetStdHandle,CreateFile或CreateConsoleScreenBuffer函数来打开其中一个句柄。
GetStdHandle功能提供了一种检索与进程关联的标准输入(STDIN),标准输出(STDOUT)和标准错误(STDERR)句柄的机制。在控制台创建过程中,系统创建这些句柄。最初,STDIN是控制台输入缓冲区的句柄,STDOUT和STDERR是控制台活动屏幕缓冲区的句柄。但是,SetStdHandle函数可以通过更改与STDIN,STDOUT或STDERR相关联的句柄来重定向标准句柄。因为父进程的标准句柄是由任何子进程继承的,因此对GetStdHandle的后续调用将返回重定向的句柄。因此,GetStdHandle返回的句柄可能指的是控制台I / O以外的其他操作。例如,在创建子进程之前,父进程可以使用SetStdHandle将管道句柄设置为子进程继承的STDIN句柄。当子进程调用GetStdHandle时,它将获取管道句柄。这意味着父进程可以控制子进程的标准句柄。GetStdHandle返回的句柄具有GENERIC_READ | GENERIC_WRITE访问,除非SetStdHandle已被用于设置标准句柄访问较少。
GetStdHandle返回的句柄的值不会为0,1和2,因此STDIO.H头文件(STDIN,STDOUT和STDERR)中的标准预定义流常量不能用于需要控制台的函数处理。
即使STDIN和STDOUT被重定向,CreateFile功能可以使进程获得其控制台输入缓冲区和活动屏幕缓冲区的句柄。要打开控制台输入缓冲区的句柄,请在调用CreateFile中指定CONIN $值。在调用CreateFile中指定CONOUT $值以打开控制台活动屏幕缓冲区的句柄。CreateFile使您能够指定其返回的句柄的读写访问权限。
CreateConsoleScreenBuffer函数创建一个新的屏幕缓冲区,并返回一个句柄,可以在任何接受控制台输出句柄的函数中使用。新的屏幕缓冲区在调用SetConsoleActiveScreenBuffer函数之前指定其句柄之前不起作用。请注意,更改活动屏幕缓冲区不会影响GetStdHandle返回的句柄。类似地,使用SetStdHandle更改STDOUT句柄不会影响活动屏幕缓冲区。
可以在需要控制台输入缓冲区或控制台屏幕缓冲区的控制台的任何控制台功能中使用由CreateFile和CreateConsoleScreenBuffer返回的控制台控制台。控制台功能可以使用GetStdHandle返回的句柄,如果它们未被重定向以引用除控制台I / O之外的其他功能。但是,如果将标准句柄重定向到引用文件或管道,则该句柄只能由ReadFile和WriteFile函数使用。
一个进程可以使用DuplicateHandle函数创建一个重复的控制台句柄,它具有与原始句柄不同的访问权限或可继承性。但是请注意,一个进程可以创建一个重复的控制台句柄,仅供自己使用。这与其他句柄类型(例如文件,管道或互斥对象)不同,DuplicateHandle可以创建对不同进程有效的副本。
要关闭控制台句柄,进程可以使用CloseHandle函数。