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子集[來源請求])。
參見
[編輯]註釋
[編輯]- ^ 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).