Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC_Lect.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
15 Мб
Скачать
☆

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

Система создает новую консоль, когда она создает консольный процесс (console process) – процесс с текстовым (в противоположность графическому) режимом, точкой входа которого является функция main() или _tmain(). Например, система создает новую консоль (new console), когда она запускает командный процессор (command processor – чаще всего переводится как командная строка). Когда командный процессор запускает новый консольный процесс, пользователь может указать, должна ли система содать новую консоль для нового процесса или она должна унаследовать консоль командного процессора. Процесс может создать консоль одним из следующих способов.

Первый способ. Процесс с графическим интерфейсом пользователя (GUI – Graphical User Interface) или консольный процесс, который в текущий момент времени не прикреплен (not currently attached) к консоли, может использовать функцию AllocConsole() для создания новой консоли.

Второй способ. GUI-процесс или консольный процесс может использовать функцию CreateProcess() для создания нового консольного процесса и установить флаг, предписывающий системе создать новую консоль.

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

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

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

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

  • размеры (в знакоместах) и положение (в пикселах) окна новой консоли;

  • размер (в знакоместах) дисплейного буфера консоли;

  • цветовые атрибуты (цвет символов и фона) дисплейного буфера консоли;

  • имя окна консоли, отображаемое в строке заголовка окна.

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

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

Функция

Описание

GetConsoleScreenBufferInfo()

Возвращает размер окна, буфера и цветовые атрибуты

SetConsoleWindowInfo()

Изменяет размер окна консоли

SetConsoleScreenBufferSize()

Изменяет размер дисплейного буфера

SetConsoleTextAttribute()

Устанавливает цветовые атрибуты

SetConsoleTitle()

Устанавливает заголовок окна консоли

GetConsoleTitle()

Возвращает заголовок окна консоли

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]