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


