Windows控制台

其他名称 Win32控制台
开发人员 微软
存储库 github .com /microsoft /terminal /tree /main /src /host
写在 C ++
作业系统 微软Windows
平台 IA-32X86-64ARM64
类型 终端模拟器
执照 麻省理工学院许可证
网站 文档.microsoft .com /en-us /windows /console /

Windows控制台Microsoft Windows控制台应用程序的基础架构。 Windows控制台的实例具有屏幕缓冲区输入缓冲区。它允许控制台应用程序在窗口硬件文本模式中运行(以占据整个屏幕)。用户可以使用 alt + ↵输入密钥组合。文本模式在Windows Vista和以后都无法使用。但是,从Windows 10开始,可以使用本机的全屏模式。

Windows控制台实例通常用于不需要显示图像但可能使用颜色的应用程序。示例包括CMD.EXEWindows PowershellFar ManagerMidnight Commander

2019年,控制台主机与Windows Terminal一起在MIT许可开源

窗口和全屏模式

Windows Vista上的Windows PowerShell
午夜指挥官使用拳击字符

在Windows中,控制台应用程序可以以两种模式运行。

一种模式将文本放在窗口中,并使用操作系统的字体渲染。在此模式下,应用程序与用户的交互由窗口系统控制。这类似于X窗口系统的应用,例如Xterm

第二个是全屏模式。在Windows XP及以前,全屏控制台使用硬件文本模式,并将栅格字体上传到视频适配器。这类似于文本系统控制台。这种早期的全屏模式仅支持与VGA兼容的文本模式,从而使其最大的字符分辨率为80乘28行。此模式在Windows Vista中被弃用。可以通过安装Windows XP Display驱动程序来规避此问题。但是, Windows 8及以后不接受它们。 Windows 10再次具有全屏模式,但是此实现使用本机Windows渲染子系统,而不是文本模式。它可以具有与屏幕上合适的列和行一样多的列和行。

可以使用Alt + 可以在两种模式之间切换应用程序。

细节

输入缓冲区是存储事件(来自键盘鼠标等)的队列。输出缓冲区是一个矩形网格,其中存储字符以及其属性。控制台窗口可能具有多个输出缓冲区,其中只有一个是活动的(即显示),在给定的时刻。应用程序可以通过Windows API编程与Windows控制台进行交互,该API公开了两个高级功能(例如 ReadConsoleWriteConsole)和低级功能(例如 ReadConsoleInputWriteConsoleOutput).

用户可以在系统范围或应用程序级别上更改调色板字体。但是,主机应用程序本身的每个实例都无法随时更改其调色板或字体。

Windows Console应用程序与MS-DOS应用程序不同,即使在Windows上(尤其是在Windows 9X上),它们看起来可能不会有所不同。 Windows控制台应用程序可以访问整个Windows API ,并且不在MS-DOS或兼容操作系统上运行。但是,DOS应用程序无法访问Windows API,并且只能借助Virtual Dos Machine (VDM)在32位版本的Windows上运行。

实施

Windows 95之前,没有本机对游戏机的支持。由于Windows 3.1及更早只是MS-DOS的图形接口,因此在较早的Windows版本上运行的大多数文本程序实际上是在窗口中运行的MS-DOS程序。为了简化将应用程序移植到Windows的任务,可提供Visual C ++的早期版本, QuickWin是一个在常规窗口内实现基本控制台功能的库。 Borland C ++的类似库被称为Easywin。

Windows 9x

Command.comWindows 95上的Windows控制台中运行

Windows NT相比, Windows 9X支持相对较差,因为控制台窗口在系统虚拟DOS机器中运行,因此必须通过conagent.exe在DOS VM中运行的Win32控制台应用程序的键盘输入,也可以使用对于真实的DOS应用程序,通过挂断键盘中断。 conagent.exe 然后调用VCOND (这是VXD )。然后, VCOND不得不将键盘输入传递到系统VM,然后最终将其传递到Win32控制台应用程序。除性能外,此实现的另一个问题是,Win32控制台应用程序不可见DOS VM本地的驱动器。这可能会引起混乱。

在Windows 9X下,屏幕缓冲区反映了VGA文本缓冲区的结构,每个字符单元格两个字节:一个字节,用于字符代码,一个字节用于属性(字符必须在OEM字符集中,该属性为高强度背景/否眨眼)。如果使用实际的VGA文本模式,则可以大大加快操作。

Windows NT和Windows CE

Windows在Windows 10上运行Linux的Windows子系统
CMD.EXEWindows CE 3.0上运行

传统上,客户端/服务器运行时子系统(CSRSS)负责管理Windows NT操作系统家族的控制台窗口。在Windows 7中,CSRS催生一个 conhost.exe 对于每个控制台窗口,以管理它。在Windows 8及以后,控制台应用程序产生 conhost.exe 直接处理。这种更改具有安全性和可用性的影响。当CSRSS在高度特权的安全环境中运行时,每种 conhost.exe 在与控制台应用程序相同的安全上下文中运行。此外,在Windows 7中,此更改启用了控制台Windows具有Aero Glass主题的功能。

在Windows NT和Windows CE上,屏幕缓冲区使用每个字符单元格四个字节:两个字符的字符代码,两个字节,用于属性。然后将字符编码在UnicodeUCS-2 )的16位子集中。为了向后兼容,控制台API存在两个版本:Unicode和non-nicode。 API的非单数版本可以使用代码页切换来扩展显示字符的范围(但前提是将TrueType字体用于控制台窗口,从而扩展了可用的代码范围)。甚至UTF-8也以“代码页65001”(仅从UNICODE的UCS-2子集显示)提供。

自2018年10月10日Windows时,Windows控制台具有完整的Unicode支持。

也可以看看