控制台句柄

http://m.blog.csdn.net/blog/fa6507/8456099

控制台程序通过句柄访问控制台的输入缓冲区及屏幕缓冲区。程序可以通过GetStdHandle, CreateFile, 或者 CreateConsoleScreenBuffer 函数打开所需的句柄。

  GetStdHandle 函数提供了获取该程序所关联的标准输入(STDIN)、标准输出(STDOUT)及标准错误(STDERR)的句柄的机制,控制台创建时,系统创建了这些句柄。开始,STDIN是控制台输入缓冲区句柄,STDOUT及STDERR是控制台当前屏幕缓冲区。但通过SetStdHandle函数可以重设这些标准句柄。由于父程序的标准句柄会被任意子程序继承,在调用GetStdHandle后即可返回被重设的句柄。因此,GetStdHandle返回的句柄可能不是控制台I/O。例如,创建子程序前,父程序可以通过SetStdHandle设置管道句柄为子程序的STDIN句柄,子程序调用GetStdHandle就会得到该管道句柄。这意味着父程序可以控制子程序的标准句柄。如果SetStdHandle没有对标准句柄设置更少的访问的话,GetStdHHandle返回的句柄应该包含GENERIC_READ|GENERIC_WRITE权限。

  GetStdHandle返回的句柄值不会是0、1和2,所以Stdio.h中的标准预定义常量(STDIN,STDOUT及STDERR)不能在需要控制台句柄的函数中使用。

  CreateFile 函数可以得到一个程序的控制台的输入缓冲区及当前屏幕缓冲区,即便STDIN及STDOUT重定位了也是如此。要打开到控制台输入缓冲区的句柄,只需在调用CreateFile时指定CONIN$值即可,而指定CONOUT$即打开控制台当前屏幕缓冲区的句柄。CreateFile 可让你指定返回句柄的读/写权限。

  CreateConsoleScreenBuffer 函数创建一个新的屏幕缓冲区并返回其句柄。该句柄可以用在任意需要控制台输入的函数中。新的屏幕缓冲区不会激活,除非调用了SetConsoleActiveScreenBuffer函数. 注意:变更当前屏幕缓冲区不会影响GetStdHandle的返回值;同样,SetStdHandle 变更了STDOUT句柄的话也不会影响当前屏幕缓冲区。

  CreateFile及CreateConsoleScreenBuffer 的返回值可以被任意需要访问输入缓冲区及屏幕缓冲区的函数使用。GetStdHandle 的返回值只有非重定位的I/O时才有效。如果标准句柄被重定位到一个文件或管道,那这个句柄只能通过ReadFile及WriteFile函数来使用。

  程序可以通过DuplicateHandle 函数创建一个控制台句柄副本,以进行不同的访问或继承原始句柄。注意:尽管如此,程序只能为自己使用方便而创建一个控制台句柄副本。这与其他句柄类型不同(如文件,管道或者互斥类),那些类型的句柄通过DuplicateHandle 创建的副本可以被不同程序有效使用。

  要关闭一个控制台句柄,可以调用CloseHandle 函数。

猜你喜欢

转载自www.cnblogs.com/NeverDone/p/10202164.html