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


Входной буфер консоли

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

Приложения могут получить доступ к входной буферу консоли косвенно с помощью функций ввода-вывода консоли высокого уровня или напрямую с помощью низкоуровневых функций ввода-вывода консоли. Высокоуровневый фильтр входных функций и обработка данных во входном буфере, возвращая только поток входных символов. Функции ввода низкого уровня позволяют приложениям считывать входные записи непосредственно из входного буфера консоли или помещать входные записи в входной буфер. Чтобы открыть дескриптор входного буфера консоли, укажите значение CONIN$ в вызове функции CreateFile.

Входная запись — это структура, содержащая сведения о типе события, которое произошло (клавиатура, мышь, изменение размера окна, фокус или событие меню), а также конкретные сведения о событии. Элемент EventType в структуре INPUT_RECORD указывает, какой тип события содержится в записи.

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

События клавиатуры

События клавиатуры создаются при нажатии или освобождении любого клавиши; сюда входят ключи управления. Однако клавиша ALT имеет особое значение для системы при нажатии и освобождении без сочетания с другим символом, и он не передается в приложение. Кроме того, сочетание клавиш CTRL+C не передается, если входной дескриптор находится в обработанном режиме.

Если входное событие является нажатием клавиш, элемент события в INPUT_RECORD является KEY_EVENT_RECORD структурой, содержащей следующие сведения:

  • Логическое значение, указывающее, был ли нажатием или освобожден ключ.
  • Число повторов, которое может быть больше одного, если ключ удерживается.
  • Код виртуального ключа, определяющий заданный ключ независимо от устройства.
  • Код виртуальной проверки, указывающий значение, зависящее от устройства, созданное оборудованием клавиатуры.
  • Переведенный символ Юникода™ или ANSI.
  • Переменная флага, указывающая состояние клавиш управления (КЛАВИШИ ALT, CTRL, SHIFT, NUM LOCK, SCROLL LOCK и CAPS LOCK) и указывает, был ли нажат расширенный ключ. Расширенные ключи для клавиатуры IBM® 101 и 102-клавиш являются INS, DEL, HOME, END, PAGE UP, PAGE DOWN и со стрелками в кластерах слева от числовой клавиатуры и разделения (/) и КЛАВИШ ВВОД на числовом клавиатуре.

События мыши

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

  • Для режима ввода консоли задано значение ENABLE_MOUSE_INPUT (режим по умолчанию).
  • В окне консоли фокус клавиатуры.
  • Указатель мыши находится в границах окна консоли.

Если входное событие является событием мыши, элемент события в INPUT_RECORD является MOUSE_EVENT_RECORD структурой, содержащей следующие сведения:

  • Координаты указателя мыши с точки зрения строки и столбца символьной ячейки в системе координат буфера экрана консоли.
  • Переменная флага, указывающая состояние кнопок мыши.
  • Переменная флага, указывающая состояние клавиш управления (ALT, CTRL, SHIFT, NUM LOCK, SCROLL LOCK и CAPS LOCK) и указывающая, был ли нажат расширенный ключ. Расширенные ключи для клавиатуры IBM 101 и 102-клавиш являются INS, DEL, HOME, END, PAGE UP, PAGE DOWN и со стрелками в кластерах слева от числовой клавиатуры и разделения (/) и КЛАВИШ ВВОД на числовом клавиатуре.
  • Переменная флага, указывающая, было ли событие обычным событием нажатия кнопки или выпуска кнопки, событием перемещения мыши или вторым щелчком события двойного щелчка.

Примечание.

Координаты положения мыши находятся в буфере экрана консоли, а не в окне консоли. Буфер экрана может быть прокручен относительно окна, поэтому верхний левый угол окна не обязательно является координатой (0,0) буфера экрана консоли. Чтобы определить координаты мыши относительно системы координат окна, вычитает координаты источника окна из координат положения мыши. Используйте функцию GetConsoleScreenBufferInfo, чтобы определить координаты источника окна.

Элемент dwButtonState структуры MOUSE_EVENT_RECORD имеет бит, соответствующий каждой кнопке мыши. Бит равен 1, если кнопка вниз и 0, если кнопка находится вверх. Событие выпуска кнопки обнаруживается значением 0 для члена dwEventFlags MOUSE_EVENT_RECORD и изменением бита кнопки от 1 до 0. Функция GetNumberOfConsoleMouseButtons извлекает количество кнопок мыши.

События изменения размера буфера

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

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

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

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