Win32控制台
Win32控制台(英語:Win32 console)是Windows API系統內運行控制台應用程序的文本用戶界面的實現。每個Win32控制台有一個屏幕緩衝區和一個輸入緩衝區,並可在視窗或文本模式的屏幕下使用,使用Alt+Enter鍵可在兩者間切換。
Win32控制台通常用於不需要顯示圖像但可能使用顏色的應用程序。以命令行界面工具舉例:命令行解釋器有Windows命令行提示符、Windows PowerShell;文件管理器有Far Manager和Midnight Commander;編輯器有MS-DOS編輯器。
窗口與全屏模式
[編輯]Win32控制台應用程序可以在兩種模式下運行。
一種模式是文字在一個視窗中,用戶使用操作系統的字體光柵化。這種模式下,應用程序的人機交互接口由窗口系統控制。這類似X Window系統的應用程序,例如xterm。
全屏模式下的Win32控制台使用硬件的文本模式,上傳計算機字體到顯示卡。這類似文本系統控制台。全屏將使用Windows內置的VGA驅動程序,而不會使用任何已安裝的顯卡驅動程序,除非那個驅動程序為VGA兼容。[1]因此,它只支持VGA兼容的文本模式,最大字符分辨率為80列、28行。[2]這與其他操作系統中的兼容控制台存在差異(例如Linux控制台),它們可以使用不同的驅動程序顯示更高的分辨率。因為已停止支持VGA模式,此模式在Windows Vista的Windows Display Driver Model(WDDM)中已不再使用。[3]通過安裝Windows XP的顯示驅動程序可能規避此問題,[3]但Windows 8及之後的版本只接受WDDM驅動程序。[4]
使用Alt+↵ Enter組合鍵可以在這兩種模式間切換。在類Unix系統系統的文本環境中通常沒有這樣的功能。
細節
[編輯]輸入緩衝區是一個存儲事件的隊列,事件來自鍵盤、鼠標等。輸出緩衝區是一個存儲字符以及其屬性的網格矩陣。一個控制台窗口可能有多個輸出緩衝區,但同一時刻只有一個能處於活動狀態(即顯示)。
控制台窗口可能會在桌面上顯示為一個正常窗口,或在顯卡驅動程序允許所選的屏幕尺寸時切換到全屏以使用真正的硬件文本模式。在後台非活動模式時顯示模式會被鎖定,因此閃爍不會有效。另外,不能使用下劃線屬性。
程序可以通過高級函數(例如ReadConsole
和WriteConsole
)或底層函數(例如ReadConsoleInput
和WriteConsoleOutput
)訪問Win32控制台。這些高級函數比Win32圖形用戶界面(GUI)受到更多限制。例如,程序不可能更改調色板,也不可能使用這些函數修改控制台使用的字體。[5]
Win32控制台程序經常被誤認為是MS-DOS應用程序,在Windows 9x系列上尤為常見。但是,Win32控制台應用程序只是本地Win32應用程序的一種特殊形式。32位元Windows可以通過使用NT DOS虛擬機(NTVDM)在Win32控制台中運行MS-DOS程序。
早期版本的Windows中沒有對控制台的原生支持,這是因為Windows 3.1及更早版本的Windows只是MS-DOS的一個圖形界面,在早期Windows版本上運行的大多數文本程序實質上是在窗口中運行的MS-DOS程序。為簡化將應用程序移植到Windows的任務,早期版本的Visual C++是隨在常規窗口中實現基本控制台的庫QuickWin一起提供。面向Borland C++類似的庫被稱為EasyWin。
實現
[編輯]Windows 9x
[編輯]與Windows NT相比,Windows 9x支持較差,因為它的控制台窗口運行在DOS虛擬機中,並因此對Win32控制台應用程序的鍵盤輸入是直接由運行DOS虛擬機的conagent.exe掛鉤(Hook)截取。conagent.exe
然後調用Vcond (一個VxD),Vcond然後必須將鍵盤輸入傳遞給系統虛擬機,並最終到達Win32控制台應用程序。除了性能問題,這種實現還有一個問題,DOS虛擬機不能看到Win32控制台應用程序本應看到的本地驅動器,這可能引致混亂。
在Windows 9x上,屏幕緩衝區反映了VGA文本緩衝區的結構,每個字符用兩個字節存儲:字符代碼一個字節,屬性一個字節(字符必須在OEM字符集中,屬性表示高強度背景/不閃爍)。如果使用真實的VGA文本模式,操作速度將大大加快。
Windows NT和Windows CE
[編輯]Windows NT家族的操作系統上是由客戶端/服務器運行時子系統負責Win32控制台窗口,[6]但從Windows Vista開始,它已將大部分工作卸任至單獨的可執行文件「conhost.exe」。
在Windows NT和Windows CE上,屏幕緩衝區為每個字符使用四個字節:字符代碼兩個字節,屬性兩個字節。字符使用Unicode(UCS-2)的16位子集編碼。[7]為了向後兼容,控制台API有兩個版本:Unicode和非Unicode。非Unicode版本API可以使用代碼頁切換以擴展字符顯示的範圍(但僅在該控制台窗口使用擴展可用代碼範圍的TrueType字體時)。UTF-8甚至可以「代碼頁65001」使用(僅顯示完整Unicode的UCS-2子集[來源請求])。
參見
[編輯]- 命令行界面
- 殼層(Shell)
- 系統控制台
- Linux控制台
- 基於文本 (計算機)
注釋
[編輯]- ^ VGA-Compatible Video Miniport Drivers, 2012-10-16 [2012-11-14], (原始內容存檔於2016-03-15)
- ^ Julio Sanchez; Maria P. Canton, VGA Fundamentals, Part II: DOS Graphics, The PC Graphics Handbook (for C++ Programmers) (Book), CRC Press: 125, 2003, ISBN 0849316782
- ^ 3.0 3.1 Some 16-bit DOS-based Programs and the Command Prompt will not run in full-screen mode in Windows Vista and in Windows 7. Support. Microsoft. 2011-09-23 [2017-01-14]. (原始內容存檔於2021-04-02).
- ^ Roadmap for Developing Drivers for the Windows 2000 Display Driver Model (XDDM). Windows Dev Center - Hardware. Microsoft. 16 November 2013 [16 December 2013]. (原始內容存檔於2016-03-04).
XDDM and VGA drivers will not compile on Windows 8 and later versions
- ^ A hack is available: SetConsolePalette (頁面存檔備份,存於網際網路檔案館)
- ^ Microsoft Security Advisory (930181): Exploit Code Published Affecting Windows Client Server Run-Time Subsystem. [2017-01-14]. (原始內容存檔於2008-12-13).
- ^ Console Reference. Microsoft. 2009 [2010-01-01]. (原始內容存檔於2017-07-04).