一、基本概念
Windows的使用者介面分為兩個部分:字元圖形介面和圖形化使用者介面。字元圖形介面較為簡單,主要內容包括如何在介面上讀取使用者輸入,如何向介面終端輸出資訊。如何控制介面的字型、背景、顏色等。
字元介面的人機互動介面只有一種,稱作控制台( Console)。使用者通過控制台嚮應用程式輸入命令和資料,應用程式將運行結果或提示資訊等顯示在控制台上。如cmd.exe。
字元介面應用程式的所有輸入和輸出都是通過Console,字元介面相關的API函數都是通過Console的控制代碼來Operations 主控台的。
Console控制代碼分為兩種,標準輸入(Stand In)控制代碼和標準輸出(Stand Out)控制代碼,分別用於從介面上讀取輸入和向介面輸出。
大多數情況下,字元介面應用程式都只有一個控制台視窗,其標準輸入控制代碼和標準輸出控制代碼都代表了這個控制台。然而它們確實是兩個控制代碼,所能進行的操作和許可權是不一樣的。如果使用“標準輸入控制代碼”作為參數,調用WriteConsole等用於控制台輸出的API函數是會產生錯誤的。
1、字元格(Cell)
控制台的最小單元是字元格。一個字元格可以放置一個字元。字元格是對控制台進行操作的最小單元。所有的屬性修改操作也都是以字元格為單位的。
實際上,類似於printf等標準C函數在Windows系統中都是通過系統的動態連結程式庫crtdll.dll匯出,printf函數的實現也位於crtdll.dll中,分析printf等函數的實現代碼可以發現,在Windows平台上,實際printf函數在做了格式化字串的處理後,是調用WriteConsole等API函數進行介面操作的。
2、控制檯子系統
Windows系統的應用程式分別運行於若干子系統。其中Windows和Consle是兩個最常用到的子系統,圖形化使用者介面的程式運行於Windows子系統,控制台介面的程式運行於Consle子系統。圖形化使用者介面的應用程式視窗是由應用程式調用API函數建立的,而控制台應用程式的控制台介面並不需要應用程式建立,系統會為其自動建立。
3、控制台讀寫
使用Windows API向控制台寫入資料獲從控制台擷取輸入的過程如下:
◇使用GetStdHandle函數擷取本應用程式的控制台標準輸入、輸出控制代碼(當然需要本應用程式是一個控制台程式,具有一個控制台。控制台程式在連結時需要選擇子系統為CONSOLE,連結選項:/SUBSYSTEM:CONSOLE)。
◇以標準輸出控制代碼為參數,調用WriteConsole API寫入輸出。
◇以標準輸入控制代碼為參數,調用ReadConsole API讀取輸入。
範例程式碼
更多Consoles and Character-Mode Support,可以參見[1,2]。
[1] 精通Windows API 函數、介面、編程執行個體
[2] http://msdn.microsoft.com/en-us/library/ms682010%28VS.85%29.aspx