建立主控台
系統會在啟動主控台程序 (其進入點為主要函式的字元模式程序) 時,建立新的主控台。 例如,系統會在啟動命令處理器 cmd.exe
時,建立新的主控台。 當命令處理器啟動新的主控台程序時,使用者可以指定系統是否要為新的程序建立新的主控台,或其是否要繼承命令處理器的主控台。
程序可以使用下列其中一種方法來建立主控台:
- 圖形使用者介面 (GUI) 或控制台進程可以使用 CreateProcess 函式搭配 CREATE_NEW_CONSOLE,以新的控制台建立控制台進程。 (根據預設,主控台程序會繼承其父系的主控台,而且不保證輸入會由其所預期的程序所接收。)
- 目前未連結至主控台的 GUI 或主控台程序可以使用 AllocConsole 函式來建立新的主控台。 (GUI 進程在建立時不會附加至主控台。如果主控台進程是使用 CreateProcess 搭配 DETACHED_PROCESS建立,則不會附加至主控台。
一般而言,若在需要與使用者互動時發生錯誤,程序會使用 AllocConsole 來建立主控台。 例如,GUI 程序可以在發生錯誤而無法使用一般圖形介面時建立主控台,或通常不會與使用者互動的主控台程序可以建立主控台來顯示錯誤。
進程也可以藉由在呼叫 CreateProcess 時指定CREATE_NEW_CONSOLE旗標來建立控制台。 此方法會建立子程序可存取但父程序無法存取的新主控台。 個別的主控台可讓父程序和子程序同時與使用者互動,而不會發生衝突。 如果建立主控台程序時未指定此旗標,則兩個程序都會連結至相同的主控台,而且不保證輸入會由正確的程序收到。 應用程式若要避免混淆,可以建立不會繼承輸入緩衝區控制代碼的子程序,或一次只啟用一個子程序來繼承輸入緩衝區控制代碼,並避免父程序在子程序完成之前讀取主控台輸入。
建立新的控制台會導致新的控制台視窗,以及個別的 I/O 緩衝區,以 輸出到畫面 和 用戶輸入。 與新主控台相關聯的程序會使用 GetStdHandle 函式來取得新主控台輸入和畫面緩衝區的控制代碼。 這些控制代碼可讓程序存取主控台。
程序可以在使用 CreateProcess 時指定 STARTUPINFO 結構,針對為子程序建立的第一個新主控台 (如果有的話),該結構的成員會控制其特性。 呼叫 CreateProcess 中指定的 STARTUPINFO 結構會影響指定CREATE_NEW_CONSOLE旗標時所建立的控制台。 如果子程序後續使用 AllocConsole,其也會影響所建立的主控台。 您可以指定下列主控台特性:
- 新主控台視窗的大小 (以字元資料格表示)
- 新主控台視窗的位置 (以畫面像素座標表示)
- 新主控台畫面緩衝區的大小 (以字元資料格表示)
- 新主控台畫面緩衝區的文字和背景色彩屬性
- 新主控台視窗標題列的顯示名稱
如果未指定 STARTUPINFO 值,系統會使用預設值。 子程序可以使用 GetStartupInfo 函式來判斷其 STARTUPINFO 結構中的值。
程序無法變更其主控台視窗在畫面上的位置,但是您可以使用下列主控台函式來設定或擷取 STARTUPINFO 結構中指定的其他屬性。
函式 | 描述 |
---|---|
GetConsoleScreenBufferInfo | 擷取視窗大小、畫面緩衝區大小和色彩屬性。 |
SetConsoleWindowInfo | 變更控制台視窗的大小。 |
SetConsoleScreenBufferSize | 變更主控台畫面緩衝區的大小。 |
SetConsoleTextAttribute | 設定色彩屬性。 |
SetConsoleTitle | 設定主控台視窗標題。 |
GetConsoleTitle | 擷取主控台視窗標題。 |
程序可以使用 FreeConsole 函式,將自己從繼承的主控台或由 AllocConsole 所建立的主控台卸離。
程序使用 FreeConsole 從自己的工作階段卸離後 (或者,如果沒有任何連結的工作階段),可以使用 AttachConsole 函式將本身連結至另一個現有的主控台工作階段。