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).