Введение

Инфраструктура для консольных приложений в Microsoft Windows

Консоль Windows — это инфраструктура для консольных приложений в Microsoft Windows. Экземпляр консоли Windows имеет буфер экрана и буфер ввода. Она позволяет консольным приложениям запускаться в окне или в аппаратном текстовом режиме, занимая весь экран. Пользователь может переключаться между этими режимами с помощью комбинации клавиш. Текстовый режим недоступен в Windows Vista и более поздних версиях. Однако, начиная с Windows 10, доступен нативный режим полного экрана. Экземпляры консоли Windows обычно используются для приложений, которым не требуется отображение изображений, но которые могут использовать цвет. Примеры включают cmd.exe, Windows PowerShell, Far Manager и Midnight Commander. В 2019 году хост консоли был выпущен под лицензией MIT с открытым исходным кодом вместе с Windows Terminal.

Режим окна и полный экран

В Windows консольное приложение может работать в двух режимах. Один режим выводит текст в окно и использует рендеринг шрифтов операционной системой. В этом режиме взаимодействие приложения с пользователем контролируется оконной системой. Это аналогично приложениям X Window System, таким как xterm. Второй режим – полноэкранный. В Windows XP и более ранних версиях полноэкранная консоль использует аппаратный текстовый режим и загружает растровый шрифт в видеоадаптер. Это аналогично системной текстовой консоли. Этот ранний полноэкранный режим поддерживает только VGA-совместимые текстовые режимы, обеспечивая максимальное разрешение символов 80 столбцов на 28 строк. Этот режим устарел в Windows Vista. Обойти это ограничение можно было, установив драйвер дисплея Windows XP; в Windows 10 режим полноэкранного отображения снова доступен, но эта реализация использует встроенную подсистему рендеринга Windows, а не текстовый режим. Он может вмещать столько столбцов и строк, сколько позволяет размер экрана. Приложения могут переключаться между этими двумя режимами с помощью комбинации клавиш.

Подробности

Буфер ввода — это очередь, в которой хранятся события (от клавиатуры, мыши и т. п.). Буфер вывода представляет собой прямоугольную сетку, в которой хранятся символы вместе с их атрибутами. Окно консоли может иметь несколько буферов вывода, но активен (то есть отображается) только один из них в данный момент. Приложения могут программно взаимодействовать с консолью Windows через Windows API, который предоставляет как функции высокого уровня (например, ReadConsole и WriteConsole), так и функции низкого уровня (например, ReadConsoleInput и WriteConsoleOutput). Пользователи могут изменять цветовую палитру или шрифт либо на уровне всей системы, либо на уровне приложения. Однако каждый экземпляр консольного приложения не может динамически изменять свою цветовую палитру или шрифт. Приложения Windows Console отличаются от приложений MS-DOS, хотя в Windows (особенно в Windows 9x) они могут выглядеть одинаково. Приложения Windows Console имеют доступ ко всему Windows API и не работают в MS-DOS или совместимых операционных системах. Приложения DOS, напротив, не могут получить доступ к Windows API и могут работать только на 32-битных версиях Windows с помощью виртуальной машины DOS (VDM).

Реализация

До Windows 95 встроенной поддержки консолей не было. Поскольку Windows 3.1 и более ранние версии представляли собой лишь графическую оболочку для MS-DOS, большинство текстовых программ, работавших в этих версиях Windows, фактически являлись программами MS-DOS, запущенными в окне. Чтобы упростить портирование приложений в Windows, ранние версии Visual C++ поставлялись с QuickWin – библиотекой, реализующей базовую функциональность консоли в обычном окне. Аналогичная библиотека для Borland C++ называлась EasyWin.

Windows 9x

Поддержка Windows 9x значительно хуже, чем в Windows NT, поскольку консольное окно работает в системной виртуальной DOS-машине, и поэтому ввод с клавиатуры в Win32-консольное приложение должен был направляться через conagent.exe, работающий в той же DOS-виртуальной машине, которая также используется для реальных DOS-приложений путем перехвата прерывания клавиатуры. Conagent.exe затем вызывает Vcond (являющийся VxD). Vcond, в свою очередь, должен был передать ввод с клавиатуры в системную виртуальную машину, а затем, наконец, в Win32-консольное приложение. Помимо снижения производительности, эта реализация имеет и другую проблему: диски, локальные для DOS-виртуальной машины, не видны Win32-консольному приложению. Это может приводить к недоразумениям. В Windows 9x буфер экрана повторяет структуру буфера текста VGA, используя два байта на каждую ячейку символа: один байт для кода символа и один байт для атрибутов (символ должен быть из набора OEM, атрибут определяет цвет фона высокой интенсивности и отсутствие мигания). Это значительно ускоряет работу, если используется реальный текстовый режим VGA.

Windows NT и Windows CE

Традиционно подсистема времени выполнения клиент/сервер (CSRSS) отвечала за управление консольными окнами в семействе операционных систем Windows NT. В Windows 7 CSRSS запускает один процесс conhost.exe для каждого консольного окна для его управления. В Windows 8 и более поздних версиях консольные приложения запускают свои процессы conhost.exe напрямую. Это изменение имеет последствия как для безопасности, так и для удобства использования. В то время как CSRSS работает в контексте безопасности с высокими привилегиями, каждый процесс conhost.exe работает в том же контексте безопасности, что и консольное приложение. Кроме того, в Windows 7 это изменение позволило консольным окнам использовать возможности темы Aero Glass. В Windows NT и Windows CE буфер экрана использует четыре байта на каждую ячейку символа: два байта для кода символа и два байта для атрибутов. Затем символ кодируется в 16-битном подмножестве Unicode (UCS-2). Для обеспечения обратной совместимости консольные API существуют в двух версиях: Unicode и non-Unicode. Non-Unicode версии API могут использовать переключение кодовых страниц для расширения диапазона отображаемых символов (но только если для консольного окна используются шрифты TrueType, тем самым расширяя диапазон доступных кодов). Даже UTF-8 доступен как "кодовая страница 65001" (отображает только из подмножества UCS-2 полного Unicode). Начиная с обновления Windows 10 за октябрь 2018 года, Windows Console имеет полную поддержку Unicode.