Создание консоли

Система создает новую консоль при запуске процесса консоли (процесса в символьном режиме, начальной точкой которого является функция main). Например, система создает новую консоль при запуске обработчика команд cmd.exe. Когда обработчик команд запускает новый процесс консоли, пользователь может указать, что должна сделать система: создать новую консоль для нового процесса или наследовать консоль обработчика команд.

Процесс может создать консоль с помощью одного из следующих методов:

  • Графический пользовательский интерфейс (GUI) или процесс консоли может использовать функцию CreateProcess с флагом CREATE_NEW_CONSOLE для создания процесса консоли с новой консолью. По умолчанию процесс консоли наследует родительскую консоль, но при этом нет гарантии, что входные данные будут получены процессом, для которого они предназначены.
  • Процесс консоли или графического пользовательского интерфейса, в настоящее время не подключенный к консоли, может использовать для создания новой консоли функцию AllocConsole. (Процессы GUI не прикрепляются к консоли при их создании. Процессы консоли не привязываются к консоли, если они созданы с помощью CreateProcess с DETACHED_PROCESS.)

Обычно процесс использует для создания консоли функцию AllocConsole, если возникает ошибка, требующая взаимодействия с пользователем. Например, процесс графического пользовательского интерфейса может создать консоль при возникновении ошибки, которая не позволяет использовать обычный графический интерфейс. Или же процесс консоли, который обычно не взаимодействует с пользователем, может создать консоль для отображения ошибки.

Процесс также может создать консоль, указав флаг CREATE_NEW_CONSOLE в вызове функции CreateProcess. Этот метод приводит к созданию новой консоли, которая доступна дочернему, но не родительскому процессу. Отдельные консоли позволяют без конфликтов взаимодействовать с пользователем как дочерним, так и родительским процессам. Если этот флаг не указан при создании процесса консоли, оба процесса подключаются к одной консоли. При этом нет гарантии, что нужный процесс получит предназначенные для него входные данные. Приложения могут предотвратить такую путаницу, создав дочерние процессы, которые не наследуют дескрипторы входного буфера, или включив одновременно только один дочерний процесс для наследования дескриптора входного буфера и в то же время запретив родительскому процессу считывать входные данные консоли до тех пор, пока не завершится работа дочернего процесса.

Создание новой консоли приводит к созданию нового окна консоли, а также отдельных буферов ввода-вывода для вывода сведений на экран и ввода сведений от пользователя. Процесс, связанный с новой консолью, использует функцию GetStdHandle для получения дескрипторов буфера входных данных и экранного буфера новой консоли. Такие дескрипторы позволяют процессу получить доступ к консоли.

Если процесс использует функцию CreateProcess, он может указать структуру STARTUPINFO, элементы которой управляют характеристиками первой новой консоли (при ее наличии), созданной для этого дочернего процесса. Структура STARTUPINFO, указанная в вызове функции CreateProcess, влияет на созданную консоль, если задан флаг CREATE_NEW_CONSOLE. Она также влияет на созданную консоль, если дочерний процесс в дальнейшем использует функцию AllocConsole. Можно задать следующие характеристики консоли:

  • размер нового окна консоли в символьных ячейках;
  • расположение нового окна консоли в пиксельных координатах экрана;
  • размер нового экранного буфера консоли в символьных ячейках;
  • атрибуты цвета для текста и фона нового экранного буфера консоли;
  • отображаемое имя для заголовка нового окна консоли.

Система использует значения по умолчанию, если значения STARTUPINFO не указаны. Дочерний процесс может использовать функцию GetStartupInfo, чтобы определить значения в своей структуре STARTUPINFO.

Процесс не может изменить расположение своего окна консоли на экране, но вы можете использовать следующие функции консоли, чтобы задать или получить другие свойства в структуре STARTUPINFO.

Function Description
GetConsoleScreenBufferInfo Получает данные о размере окна, размере экранного буфера и атрибутах цвета.
SetConsoleWindowInfo Изменяет размер окна консоли.
SetConsoleScreenBufferSize Изменяет размер экранного буфера консоли.
SetConsoleTextAttribute Задает атрибуты цвета.
SetConsoleTitle Задает заголовок окна консоли.
GetConsoleTitle Получает заголовок окна консоли.

Процесс может использовать функцию FreeConsole, чтобы отключиться от наследованной консоли или от консоли, созданной функцией AllocConsole.

Процесс может использовать функцию AttachConsole, чтобы подключиться к другому существующему сеансу консоли после использования FreeConsole для отключения от собственного сеанса (или при отсутствии подключения к сеансу).