認識控制台 控制台控制代碼 附著到控制台 關閉控制台

2021-06-03 13:51:04 字數 1913 閱讀 5036

1. 附著到乙個控制台

乙個程序可以使用 attachconsole 函式來附著到乙個控制台上,乙個程序只能附著乙個控制台。

乙個控制台可以有許多程序附著到它上面,呼叫 getconsoleprocesslist 函式可以得到附著到乙個控制台的列表。

2. 關閉乙個控制台

程序可以使用 freeconsole 函式來將其自身從乙個控制台脫離出來。如果其他程序共享這個控制台,控制台不會被銷 毀,但呼叫 freeconsole 函式的程序不能在使用它了,在程序呼叫 freeconsole 之後,它可以使用 allocconsole 來建立乙個新的控制台或 attachconsole 來附著到另乙個控制台上。

控制在最後乙個附著的程序關閉的時候或呼叫 freeconsole 的時候被關閉。

3. 控制台控制代碼

控制台程序使用控制代碼來訪問控制台的輸入和螢幕緩衝區。乙個程序可以使用 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 )中預定義的流常量不能在需要乙個控制台控制代碼的函式中使用。

createfile 函式即使 stdin 和 stdout 沒有被重定向的情況下,也可以讓乙個程序得到輸入緩衝區和活動螢幕緩衝區的控制代碼。為了 開啟乙個控制台輸入緩衝區的控制代碼,需要在呼叫 createfile 的時候指定 conin$ 值,而指定 conout$ 值可以開啟乙個控制台活動螢幕緩衝區的控制代碼。 createfile 函式使你可以通過它返回的控制代碼來讀寫操作。

函式 createconsolescreenbuffer 建立乙個新的螢幕緩衝區且返回這個控制代碼,這個控制代碼可以在所有接受乙個 控制輸出作為引數的函式中使用。新的螢幕緩衝區不會是活動的,只有呼叫 setconsoleactivescreenbuffer 函式的時候指定該值才會被設定為活動的。活動螢幕緩衝區的改變不會改 變 getstdhandle 的值,同樣使用 setstdhandle 改變 stdout 控制代碼也不會影響活動螢幕緩衝區。

createfile 和 createconsolescreenbuffer 函式返回的控制代碼能在任何需要控制台輸入緩衝區或控制台屏 幕緩衝區作為引數的函式中, getstdhandle 返回的控制代碼只要沒有被重定向為其他的控制代碼都可以在控制台函式中使用,如果標準控制代碼被重定向為指向乙個檔案或管道,這些控制代碼只能被 readfile 和 writefile 函式使用。

程序可以使用 duplicatehandle 函式來建立乙個控制台控制代碼的副本,可以指定不 同的訪問和繼承許可權。注意,程序可以自己使用而建立乙個控制台控制代碼副本。這與其他的控制代碼型別不同(例如檔案、管道、訊號量物件),這些型別可以通過 duplicatehandle 來建立乙個有效的控制代碼,而別的程序也可以使用。

認識控制台 控制台控制代碼 附著到控制台 關閉控制台

附著到乙個控制台 乙個程序可以使用 attachconsole 函式來附著到乙個控制台上,乙個程序只能附著乙個控制台。乙個控制台可以有許多程序附著到它上面,呼叫 getconsoleprocesslist 函式可以得到附著到乙個控制台的列表。關閉乙個控制台 程序可以使用 freeconsole 函式...

控制台輸出控制

by jingzhongrong 通過win32api提供的函式,可以對控制台程式的輸出進行控制,例如字型顏色 標題文字,以及各種屬性等等。主要使用到的函式以及宣告如下 handle getstdhandle dword nstdhandle 此函式用於獲取控制台輸出 輸入控制代碼。得到控制代碼之後...

沒有控制台視窗的控制台程式

include include pragma comment linker,subsystem windows entry maincrtstartup int main int argc,char argv 編譯後執行程式會彈出乙個訊息框,而沒有背後的控制台視窗。再看看下面的 include in...