控制台进程使用句柄访问其主机的输入和屏幕缓冲区。 进程可以使用 GetStdHandle、 CreateFile 或 CreateConsoleScreenBuffer 函数打开其中一个句柄。
GetStdHandle 函数提供用于检索与进程关联的标准输入(STDIN)、标准输出(STDOUT)和标准错误(STDERR)句柄的机制。 在控制台创建期间,系统会创建这些句柄。 最初,STDIN是主机输入缓冲区的句柄,并且STDOUTSTDERR是主机的活动屏幕缓冲区的句柄。 但是, SetStdHandle 函数可以通过更改与 STDIN或 STDOUT关联的 STDERR句柄来重定向标准句柄。 由于父级的标准句柄由任何子进程继承,因此对 GetStdHandle 的后续调用将返回重定向的句柄。 因此, GetStdHandle 返回的句柄可能引用主机 I/O 以外的其他内容。 例如,在创建子进程之前,父进程可以使用 SetStdHandle 将管道句柄设置为子进程继承的句柄 STDIN 。 子进程调用 GetStdHandle 时,它将获取管道句柄。 这意味着父进程可以控制子进程的标准句柄。
GetStdHandle 返回的句柄具有GENERIC_READ | GENERIC_WRITE访问权限,除非已使用 SetStdHandle 来设置标准句柄,以便具有较少的访问权限。
GetStdHandle 返回的句柄的值不是 0、1 和 2,因此,在需要控制台句柄的函数中不能使用标准STDINSTDOUTSTDERR预定义流常量。
CreateFile 函数使进程能够获取其主机的输入缓冲区和活动屏幕缓冲区的句柄,即使STDIN已重定向也是如此STDOUT。 若要打开控制台输入缓冲区的句柄,请在对 CreateFile 的调用中指定CONIN$值。 指定 CONOUT$ 对 CreateFile 的调用中的值,以打开主机的活动屏幕缓冲区的句柄。
使用 CreateFile 可以指定它返回的句柄的读/写访问权限。
CreateConsoleScreenBuffer 函数创建新的屏幕缓冲区并返回句柄。 此句柄可用于接受控制台输出句柄的任何函数。 在对 SetConsoleActiveScreenBuffer 函数的调用中指定新屏幕缓冲区之前,新屏幕缓冲区不会处于活动状态(显示)。 请注意,更改活动屏幕缓冲区不会影响 GetStdHandle 返回的句柄。 同样,使用 SetStdHandle 更改 STDOUT 句柄不会影响活动屏幕缓冲区。
CreateFile 和 CreateConsoleScreenBuffer 返回的控制台句柄可用于任何需要控制台输入缓冲区或控制台屏幕缓冲区句柄的控制台函数。 如果 GetStdHandle 返回的句柄尚未重定向到引用主机 I/O 以外的其他内容,则控制台函数可以使用这些句柄。 但是,如果已重定向标准句柄来引用文件或管道,则句柄只能由 ReadFile 和 WriteFile 函数使用。
GetFileType 可以帮助确定句柄引用的设备类型。 控制台句柄显示为 FILE_TYPE_CHAR.
进程可以使用 DuplicateHandle 函数创建具有不同访问权限或从原始句柄继承性的重复控制台句柄。 但是,请注意,进程只能创建重复的控制台句柄供自己使用。 这不同于其他句柄类型(如文件、管道或互斥体对象), 而 DuplicateHandle 可以为其创建对不同进程有效的重复项。 在 创建 其他进程期间,必须共享对主机的访问权限,也可以通过 AttachConsole 机制请求其他进程。
若要关闭控制台句柄,进程可以使用 CloseHandle 函数。