Поделиться через


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

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

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

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

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

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

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

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

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

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

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

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

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

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