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


Режимы консоли высокого уровня

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

  • Режим ввода строки
  • Обработанный режим ввода
  • Режим ввода эхо

Оба следующих режима вывода консоли включены для буфера экрана консоли при создании:

  • Обработанный выходной режим
  • Упаковка в выходной режим EOL

Все три режима ввода, а также обработанный режим вывода предназначены для совместной работы. Рекомендуется включить или отключить все эти режимы в виде группы. Когда все включено, приложение, как сообщается, находится в режиме "приготовленного" режима, что означает, что большая часть обработки обрабатывается для приложения. Если все отключены, приложение находится в режиме "необработанный", что означает, что входные данные не фильтруются и любая обработка остается в приложении.

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

Если в качестве входного дескриптора используется параметр hConsoleHandle, режим может быть одним из следующих. При создании консоли все режимы ввода, кроме ENABLE_WINDOW_INPUT и ENABLE_VIRTUAL_TERMINAL_INPUT, включены по умолчанию.

Значение Значение
ENABLE_ECHO_INPUT 0x0004 Символы, считанные функцией ReadFile или ReadConsole, записываются в активный буфер экрана по мере ввода в консоли. Этот режим можно использовать только в том случае, если также включен режим ENABLE_LINE_INPUT.
ENABLE_INSERT_MODE 0x0020 Если этот режим включен, вводимый в окне консоли текст будет вставлен по текущему расположению курсора, а весь последующий текст не будет перезаписан. Если этот режим отключен, весь последующий текст будет перезаписан.
ENABLE_LINE_INPUT 0x0002 Функция ReadFile или ReadConsole возвращает значение только в том случае, если считан символ возврата каретки. Если этот режим отключен, функции возвращают значение при доступности одного или нескольких символов.
ENABLE_MOUSE_INPUT 0x0010 Если указатель мыши находится в границах окна консоли и окно находится в фокусе для ввода текста с клавиатуры, события мыши, связанные с ее перемещением и нажатиями кнопок, помещаются во входной буфер. Такие события удаляются функцией ReadFile или ReadConsole, даже если этот режим включен. Функцию ReadConsoleInput можно использовать для считывания входных записей MOUSE_EVENT из входного буфера.
ENABLE_PROCESSED_INPUT 0x0001 Нажатие клавиш CTRL+C обрабатывается системой и не помещается во входной буфер. Если входной буфер считывается функцией ReadFile или ReadConsole, нажатия других управляющих клавиш обрабатываются системой и не возвращаются в буфере ReadFile или ReadConsole. Если также включен режим ENABLE_LINE_INPUT, символы стирания назад, возврата каретки и перевода строки обрабатываются системой.
ENABLE_QUICK_EDIT_MODE 0x0040 Этот флаг позволяет пользователю использовать мышь для выбора и редактирования текста. Чтобы включить этот режим, используйте ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS. Чтобы отключить этот режим, используйте ENABLE_EXTENDED_FLAGS без этого флага.
ENABLE_WINDOW_INPUT 0x0008 Действия пользователей, которые приводят к изменению буфера экрана консоли, регистрируются во входном буфере консоли. Сведения о таких событиях могут быть считаны приложениями из входного буфера с помощью функции ReadConsoleInput, но не могут быть считаны приложениями, использующими ReadFile или ReadConsole.
ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200 Этот флаг указывает модулю обработки виртуального терминала преобразовать ввод пользователя, полученный в окне консоли, в последовательности виртуального терминала консоли, которые вспомогательное приложение может получить с помощью функций WriteFile или WriteConsole.

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

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

Значение Значение
ENABLE_PROCESSED_OUTPUT 0x0001 Символы, записываемые функцией WriteFile или WriteConsole либо выводимые функцией ReadFile или ReadConsole, анализируются для управляющих последовательностей ASCII, после чего выполняется нужное действие. Обрабатываются символы стирания назад, возврата каретки и перевода строки. Этот режим следует включить, если используются управляющие последовательности или задано значение ENABLE_VIRTUAL_TERMINAL_PROCESSING.
ENABLE_WRAP_AT_EOL_OUTPUT 0x0002 При записи с помощью функции WriteFile или WriteConsole либо выводе с помощью функции ReadFile или ReadConsole курсор перемещается в начало следующей строки, если он достиг конца текущей строки. Это приводит к тому, что строки, отображаемые в окне консоли, автоматически прокручиваются вверх, если курсор переходит далее с последней строки в окне. Кроме того, содержимое буфера экрана консоли также прокручивается вверх (с удалением верхней строки в буфере экрана консоли), если курсор переходит далее с последней строки в буфере экрана консоли. Если этот режим отключен, последний символ в строке будет перезаписан последующими символами.
ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 При записи с помощью функции WriteFile или WriteConsole символы обрабатываются для VT100 и аналогичных управляющих символьных последовательностей, которые управляют перемещением курсора, цветом и режимом шрифта, а также другими операциями, доступными для выполнения через существующие API-интерфейсы консоли. Дополнительные сведения см. в статье Последовательности виртуального терминала консоли.
При использовании этого флага убедитесь, что установлен флаг ENABLE_PROCESSED_OUTPUT.
DISABLE_NEWLINE_AUTO_RETURN 0x0008 При записи с помощью функции WriteFile или WriteConsole к переносу в конце строки добавляется дополнительное состояние, которое задерживает перемещение курсора и помещает операции прокрутки в буфер.

Как правило, если флаг ENABLE_WRAP_AT_EOL_OUTPUT установлен и текст достигает конца строки, курсор немедленно переходит на следующую строку, а содержимое буфера прокручивается на одну строку. Но если задан этот флаг, курсор не переходит на следующую строку, а операция прокрутки не выполняется. Записанный символ будет выведен в последней позиции строки, а курсор будет располагаться над этим символом (как в случае с отключенным флагом ENABLE_WRAP_AT_EOL_OUTPUT). Но следующий печатаемый символ будет выведен таким образом, как если бы флаг ENABLE_WRAP_AT_EOL_OUTPUT был включен. Перезапись при этом не выполняется. В частности, курсор быстро переходит на следующую строку, при необходимости выполняется прокрутка, символ выводится, а курсор передвигается еще на одну позицию.

Обычно этот флаг рекомендуется использовать вместе с флагом ENABLE_VIRTUAL_TERMINAL_PROCESSING, что позволяет оптимально сымитировать эмулятор терминала, в котором запись последнего символа на экране (в правом нижем углу) без немедленной прокрутки является желаемым поведением.
ENABLE_LVB_GRID_WORLDWIDE 0x0010 API-интерфейсы для записи атрибутов символов, в том числе WriteConsoleOutput и WriteConsoleOutputAttribute, позволяют использовать флаги атрибутов символов для изменения цвета переднего плана и фона текста. Кроме того, некоторые флаги DBCS указываются с префиксом COMMON_LVB. Исторически эти флаги работали только в кодовых страницах DBCS для китайского, японского и корейского языков.

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

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

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

Обратите внимание, что использование режима ENABLE_VIRTUAL_TERMINAL_PROCESSING может привести к установке флагов сетки LVB и обратного видеовывода, хотя этот флаг не включается, если подключенное приложение запрашивает видеовывод с подчеркиванием или инвертированием через последовательности виртуального терминала консоли.