Windows Console
Windows Console — графическое приложение, предназначенное для запуска консольных приложений в операционных системах Windows. Оно используется для работы с текстовыми программами, такими как операционные оболочки (Command Prompt, PowerShell), различные утилиты (например, Far Manager) и некоторые, преимущественно устаревшие, прикладные программы (например, Midnight Commander).
Также пишется как Win32 console. В Windows 10 появилась Windows Terminal, позиционируемая как замена Windows Console[1]. В 2019 году исходный код консольного хоста был открыт под лицензией MIT License вместе с Windows Terminal[2].
Общие сведения
| Windows Console | |
|---|---|
| Тип | Эмулятор терминала |
| Разработчик | Microsoft |
| Написана на | C++ |
| Операционная система | Microsoft Windows |
| Аппаратные платформы | IA-32, x86-64, ARM64 |
| Репозиторий | github.com/microsoft/ter… |
| Лицензия | MIT License |
| Сайт | docs.microsoft.com/en-us… |
Использование
Windows Console может работать как в оконном, так и в полноэкранном режиме. Переключение между режимами производится с помощью сочетания клавиш Alt+Enter.
В оконном режиме консоль отображает текст в отдельном окне, используя средства рендеринга шрифтов операционной системы. В этом случае взаимодействие пользователя с приложением осуществляется посредством оконной системы — аналогично приложениям X Window System, таким как xterm.
В Windows XP и более ранних версиях полноэкранный режим использовал аппаратный текстовый режим и загружал растровый шрифт в видеоадаптер, подобно текстовой системной консоли. Этот режим поддерживал только текстовые режимы, совместимые с VGA, с максимальным разрешением 80 столбцов на 28 строк[3]. В Windows Vista этот режим был удалён[4], хотя вплоть до Windows 8 его можно было вернуть, установив драйвер видеокарты от Windows XP[4][5].
В Windows 10 полноэкранный режим вновь доступен. Его реализация использует собственную подсистему рендеринга Windows вместо аппаратного текстового режима и позволяет динамически заполнять окно символами по количеству строк и столбцов[6].
Программы могут взаимодействовать с консолью через Windows API, который предоставляет как высокоуровневые функции (ReadFile, ReadConsole, WriteFile, WriteConsole), так и низкоуровневые функции (ReadConsoleInput, WriteConsoleOutput)[7].
Пользователь может настраивать шрифт и цветовую палитру консоли — как системно, так и на уровне отдельного приложения. Однако экземпляр консольного приложения не может изменять эти параметры «на лету» в процессе работы.
Консольные приложения отличаются от приложений MS-DOS, хотя во внешнем виде (особенно в Windows 9x) могут быть похожи. Консольное приложение имеет доступ к Windows API и не работает в среде MS-DOS или совместимых системах. DOS-приложение не может использовать Windows API и работает только на 32-битных версиях Windows с помощью Virtual DOS Machine (VDM).
Архитектура
Каждый экземпляр Windows Console располагает буфером экрана и буфером ввода. Буфер ввода — это очередь, в которую поступают события ввода (от клавиатуры, мыши и др.). Буфер вывода — прямоугольная сетка, где хранятся символы и их атрибуты. Консольное окно может иметь несколько буферов вывода, но одновременно отображается только один из них (активный).
Реализации
В Windows 3.1 и более ранних версиях не было собственной поддержки консоли — эти системы представляли собой графический интерфейс поверх MS-DOS, и большинство текстовых программ реализованы как MS-DOS-приложения в окне. Для упрощения портирования приложений на Windows в ранних версиях Visual C++ использовалась библиотека QuickWin, реализующая базовые консольные возможности в обычном окне. Аналогичная библиотека для Borland C++ называлась EasyWin.
В Windows 9x поддержка консоли была существенно ограничена по сравнению с Windows NT, поскольку консольное окно работало внутри виртуальной DOS-машины, а ввод с клавиатуры для приложений Win32 консоли обрабатывался процессом conagent.exe, выполнявшемся также в среде DOS через перехват прерывания клавиатуры. Затем conagent.exe передавал данные драйверу Vcond (VxD), который далее обеспечивал передачу ввода основной виртуальной машине и, в итоге, Win32-программе. Кроме невысокой производительности, проблема заключалась также в том, что локальные для данной ДОС-машины диски были невидимы для Win32-консольных программ.
В Windows 9x буфер экрана повторял структуру VGA-буфера: на каждый символ приходилось по два байта (один для кода символа — в OEM-странице, другой для атрибутов), что ускоряло работу при использовании VGA-режима.
Традиционно управление оконными консолями в семействах Windows NT выполнялось подсистемой Client/Server Runtime Subsystem (CSRSS)[8]. В Windows 7 CSRSS запускает отдельный процесс conhost.exe для каждого окна консоли. В Windows 8 и новее процессы conhost.exe запускаются непосредственно приложением консоли. Это изменение имело как соображения безопасности (процесс CSRSS работает в привилегированном режиме, а conhost.exe — в контексте пользователя консольного приложения), так и функциональности — начиная с Windows 7, консольные окна получили поддержку тем оформления Aero Glass[9].
В Windows NT и Windows CE экранный буфер реализован с использованием четырёх байт на ячейку: два байта на код символа и два — на атрибуты. Символы кодируются в 16-битном диапазоне Unicode (UCS-2)[10]. Для обратной совместимости консольный API доступен в вариантах Unicode и не-Unicode; последний поддерживает смену кодовой страницы (например, с TrueType-шрифтами), а также используется режим UTF-8 (кодовая страница 65001)[11].
С обновления Windows 10 за октябрь 2018 года Windows Console получила полноценную поддержку Unicode[12].
Примечания
- ↑ Cinnamon, Kayla Introducing Windows Terminal (англ.). Microsoft Corporation (6 мая 2019). Дата обращения: 20 ноября 2020. Архивировано 25 августа 2025 года.
- ↑ Cinnamon, Kayla Introducing Windows Terminal (англ.). Windows Command Line Tools For Developers. Microsoft (6 мая 2019). Дата обращения: 10 мая 2019. Архивировано 25 августа 2025 года.
- ↑ Julio Sanchez. VGA Fundamentals, Part II: DOS Graphics // The PC Graphics Handbook (for C++ Programmers) / Julio Sanchez, Maria P. Canton. — CRC Press, 2003. — P. 125. — ISBN 0849316782.
- ↑ 1 2 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 (23 сентября 2011). Архивировано 30 сентября 2011 года.
- ↑ Roadmap for Developing Drivers for the Windows 2000 Display Driver Model (XDDM). Windows Dev Center - Hardware. Microsoft (16 ноября 2013). — «XDDM and VGA drivers will not compile on Windows 8 and later versions». Дата обращения: 16 декабря 2013. Архивировано 4 марта 2016 года.
- ↑ Tkachenko, Sergey Open command prompt fullscreen in Windows 10 (амер. англ.). Winaero (24 ноября 2014). Дата обращения: 31 июля 2019. Архивировано 31 июля 2025 года.
- ↑ Console Modes. Windows Console documentation. Microsoft. Дата обращения: 13 октября 2020. Архивировано 17 октября 2020 года.
- ↑ Microsoft Security Advisory (930181): Exploit Code Published Affecting Windows Client Server Run-Time Subsystem. Архивировано 10 февраля 2008 года.
- ↑ Yosifovich, Pavel. Windows Internals, Part 1: System architecture, processes, threads, memory management, and more / Pavel Yosifovich, Alex Ionescu, Mark E. Russinovich … [и др.]. — 7th. — Redmond, Washington : Microsoft Press, 2017-05-15. — P. 67. — ISBN 9780735684188.
- ↑ Console Reference. Microsoft (2009). Дата обращения: 1 января 2010. Архивировано 19 сентября 2008 года.
- ↑ Release Notes (амер. англ.). docs.microsoft.com (27 июня 2022). — «Console: Fix for no output text being displayed in codepage 65001 (utf8)». Архивировано 4 июля 2022 года.
- ↑ Turner, Rich Windows Command-Line: Unicode and UTF-8 Output Text Buffer (амер. англ.). Windows Command Line Tools For Developers. Microsoft (15 ноября 2018). Дата обращения: 14 июня 2019. Архивировано 24 сентября 2025 года.