Win32控制台

Win32控制台(英语:Win32 console)是Windows API系统内运行控制台应用程式文本用户界面英语Text user interface的实现。每个Win32控制台有一个屏幕缓冲区和一个输入缓冲区,并可在窗口文本模式的屏幕下使用,使用Alt+Enter键可在两者间切换。

Windows Vista上使用Win32控制台窗口的Windows PowerShell
GNU Midnight Commander在Win32控制台中使用方框绘制字符

Win32控制台通常用于不需要显示图像但可能使用颜色的应用程式。以命令行界面工具举例:命令行解释器有Windows命令行提示符Windows PowerShell文件管理器Far Manager英语Far ManagerMidnight Commander;编辑器有MS-DOS编辑器英语MS-DOS Editor

窗口与全屏模式

Win32控制台应用程式可以在两种模式下运行。

一种模式是文字在一个窗口中,用户使用操作系统的字体光栅化。这种模式下,应用程式的人机交互接口由窗口系统控制。这类似X窗口系统的应用程式,例如xterm

全屏模式下的Win32控制台使用硬件的文本模式,上传电脑字体显示卡。这类似文本系统控制台英语System console。全屏将使用Windows内建的VGA驱动程式,而不会使用任何已安装的显卡驱动程式,除非那个驱动程式为VGA兼容。[1]因此,它只支持VGA兼容的文本模式,最大字符分辨率为80英语Characters per line、28行。[2]这与其他操作系统中的兼容控制台存在差异(例如Linux控制台英语Linux console),它们可以使用不同的驱动程式显示更高的分辨率。因为已停止支持VGA模式,此模式在Windows VistaWindows Display Driver Model(WDDM)中已不再使用。[3]通过安装Windows XP的显示驱动程式可能规避此问题,[3]Windows 8及之后的版本只接受WDDM驱动程式。[4]

使用Alt+↵ Enter组合键可以在这两种模式间切换。在类Unix系统系统的文本环境中通常没有这样的功能。

细节

输入缓冲区是一个存储事件的队列,事件来自键盘滑鼠等。输出缓冲区是一个存储字符以及其属性的网格矩阵。一个控制台窗口可能有多个输出缓冲区,但同一时刻只有一个能处于活动状态(即显示)。

控制台窗口可能会在桌面上显示为一个正常窗口,或在显卡驱动程式允许所选的屏幕尺寸时切换到全屏以使用真正的硬件文本模式。在后台非活动模式时显示模式会被锁定,因此闪烁不会有效。另外,不能使用下划线属性。

程序可以通过高级函数(例如ReadConsoleWriteConsole)或底层函数(例如ReadConsoleInputWriteConsoleOutput)访问Win32控制台。这些高级函数比Win32图形用户界面(GUI)受到更多限制。例如,程序不可能更改调色板,也不可能使用这些函数修改控制台使用的字体[5]

Win32控制台程序经常被误认为是MS-DOS应用程式,在Windows 9x系列上尤为常见。但是,Win32控制台应用程式只是本地Win32应用程式的一种特殊形式。32位Windows可以通过使用NT DOS虚拟机英语Virtual DOS machine(NTVDM)在Win32控制台中运行MS-DOS程序。

早期版本的Windows中没有对控制台的原生支持,这是因为Windows 3.1及更早版本的Windows只是MS-DOS的一个图形界面,在早期Windows版本上运行的大多数文本程序实质上是在窗口中运行的MS-DOS程序。为简化将应用程式移植到Windows的任务,早期版本的Visual C++是随在常规窗口中实现基本控制台的库QuickWin英语QuickWin一起提供。面向Borland C++类似的库被称为EasyWin。

实现

Windows 9x

Windows NT相比,Windows 9x支持较差,因为它的控制台窗口运行在DOS虚拟机英语Virtual DOS machine中,并因此对Win32控制台应用程式的键盘输入是直接由运行DOS虚拟机的conagent.exe挂钩(Hook)截取。conagent.exe然后调用Vcond (一个VxD,Vcond然后必须将键盘输入传递给系统虚拟机,并最终到达Win32控制台应用程式。除了性能问题,这种实现还有一个问题,DOS虚拟机不能看到Win32控制台应用程式本应看到的本地驱动器,这可能引致混乱。

在Windows 9x上,屏幕缓冲区反映了VGA文本缓冲区英语VGA-compatible text mode的结构,每个字符用两个字节存储:字符代码一个字节,属性一个字节(字符必须在OEM字符集英语OEMCP中,属性表示高强度背景/不闪烁)。如果使用真实的VGA文本模式,操作速度将大大加快。

Windows NT和Windows CE

Windows NT家族的操作系统上是由客户端/伺服器运行时子系统负责Win32控制台窗口,[6]但从Windows Vista开始,它已将大部分工作卸任至单独的可执行文件“conhost.exe”。

在Windows NT和Windows CE上,屏幕缓冲区为每个字符使用四个字节:字符代码两个字节,属性两个字节。字符使用UnicodeUCS-2)的16位子集编码。[7]为了向后兼容,控制台API有两个版本:Unicode和非Unicode。非Unicode版本API可以使用代码页切换以扩展字符显示的范围(但仅在该控制台窗口使用扩展可用代码范围的TrueType字体时)。UTF-8甚至可以“代码页65001”使用(仅显示完整Unicode的UCS-2子集[来源请求])。

参见

注释

  1. ^ VGA-Compatible Video Miniport Drivers, 2012-10-16 [2012-11-14], (原始内容存档于2016-03-15) 
  2. ^ 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. ^ 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). 
  4. ^ 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 
  5. ^ A hack is available: SetConsolePalette页面存档备份,存于互联网档案馆
  6. ^ Microsoft Security Advisory (930181): Exploit Code Published Affecting Windows Client Server Run-Time Subsystem. [2017-01-14]. (原始内容存档于2008-12-13). 
  7. ^ Console Reference. Microsoft. 2009 [2010-01-01]. (原始内容存档于2017-07-04). 

外部链接