1. 程式人生 > >控制檯控制代碼

控制檯控制代碼

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 函式。