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

Использование

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

undefined
undefined

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

Шрифты и цвета

Пользователь может настраивать шрифт и цветовую палитру консоли — как системно, так и на уровне отдельного приложения. Однако экземпляр консольного приложения не может изменять эти параметры «на лету» в процессе работы.

Отличие от DOS-приложений

Консольные приложения отличаются от приложений 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

undefined

В Windows 9x поддержка консоли была существенно ограничена по сравнению с Windows NT, поскольку консольное окно работало внутри виртуальной DOS-машины, а ввод с клавиатуры для приложений Win32 консоли обрабатывался процессом conagent.exe, выполнявшемся также в среде DOS через перехват прерывания клавиатуры. Затем conagent.exe передавал данные драйверу Vcond (VxD), который далее обеспечивал передачу ввода основной виртуальной машине и, в итоге, Win32-программе. Кроме невысокой производительности, проблема заключалась также в том, что локальные для данной ДОС-машины диски были невидимы для Win32-консольных программ.

В Windows 9x буфер экрана повторял структуру VGA-буфера: на каждый символ приходилось по два байта (один для кода символа — в OEM-странице, другой для атрибутов), что ускоряло работу при использовании VGA-режима.

Windows NT и Windows CE

undefined
undefined

Традиционно управление оконными консолями в семействах 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].

Примечания

  1. Cinnamon, Kayla Introducing Windows Terminal (англ.). Microsoft Corporation (6 мая 2019). Дата обращения: 20 ноября 2020. Архивировано 25 августа 2025 года.
  2. Cinnamon, Kayla Introducing Windows Terminal (англ.). Windows Command Line Tools For Developers. Microsoft (6 мая 2019). Дата обращения: 10 мая 2019. Архивировано 25 августа 2025 года.
  3. 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.
  4. 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 года.
  5. 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 года.
  6. Tkachenko, Sergey Open command prompt fullscreen in Windows 10 (амер. англ.). Winaero (24 ноября 2014). Дата обращения: 31 июля 2019. Архивировано 31 июля 2025 года.
  7. Console Modes. Windows Console documentation. Microsoft. Дата обращения: 13 октября 2020. Архивировано 17 октября 2020 года.
  8. Microsoft Security Advisory (930181): Exploit Code Published Affecting Windows Client Server Run-Time Subsystem. Архивировано 10 февраля 2008 года.
  9. 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.
  10. Console Reference. Microsoft (2009). Дата обращения: 1 января 2010. Архивировано 19 сентября 2008 года.
  11. Release Notes (амер. англ.). docs.microsoft.com (27 июня 2022). — «Console: Fix for no output text being displayed in codepage 65001 (utf8)». Архивировано 4 июля 2022 года.
  12. 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 года.