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

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

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

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

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

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

Эти события генерируются при нажатии и отпускании клавиш, включая управляющие клавиши. Тем не менее, клавиша Alt имеет специальное значение для системы, когда нажимается и отпускается без комбинации с другими символами, и не передается приложению. Аналогичным образом клавишная команда Ctrl+C тоже не передается, если дескриптор ввода находится в режиме обработки.

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

  • значение булевского типа, указывающее на то, была ли клавиша нажата или отпущена;

  • счетчик повторений, больший 1 в случае, если клавиша удерживается;

  • виртуальный ключ (virtual-key code) – независимое от устройства значение, идентифицирующее клавишу клавиатуры;

  • виртуальный скан-ключ (virtual-scan code), генерируемый клавиатурой;

  • символ Unicode или ANSI;

  • флаг, указывающий на состояние клавиш сдвига (alt, ctrl, shift, num lock, scroll lock и caps lock) и на то, была ли нажата «расширенная» клавиша (enhanced key). Расширенные клавиши для клавиатур IBM 101-клавишных и 102-клавишных – это ins, del, home, end, page up, page down и клавиши перемещения курсора, расположенные левее цифровой клавиатуры (numeric keypad), а также клавиши divide (/) и Enter цифровой клавиатуры.

typedef struct _INPUT_RECORD { // ir

WORD EventType;

union {

KEY_EVENT_RECORD KeyEvent;

MOUSE_EVENT_RECORD MouseEvent;

WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;

MENU_EVENT_RECORD MenuEvent;

FOCUS_EVENT_RECORD FocusEvent;

} Event;

} INPUT_RECORD;

typedef struct _KEY_EVENT_RECORD { // ker

BOOL bKeyDown;

WORD wRepeatCount;

WORD wVirtualKeyCode;

WORD wVirtualScanCode;

union {

WCHAR UnicodeChar;

CHAR AsciiChar;

} uChar;

DWORD dwControlKeyState;

} KEY_EVENT_RECORD;

События мыши.

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

  • режим ввода консоли установлен в ENABLE_MOUSE_INPUT (это режим по умолчанию);

  • окно консоли имеет клавиатурную фокусировку (keyboard focus);

  • указатель мыши находится в области границ окна консоли.

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

  • координаты указателя мыши – позиция в строке и номер строки в координатной системе дисплейного буфера;

  • флаг, указывающий на состояние кнопок мыши;

  • флаг, указывающий на состояние клавиш сдвига (alt, ctrl, shift, num lock, scroll lock и caps lock) и на то, была ли нажата «расширенная» клавиша (enhanced key). Расширенные клавиши для клавиатур IBM 101-клавишных и 102-клавишных – это ins, del, home, end, page up, page down и клавиши перемещения курсора, расположенные левее цифровой клавиатуры (numeric keypad), а также клавиши divide (/) и Enter цифровой клавиатуры;

  • Замечание. Координаты мыши указываются в термах именно дисплейного буфера, а не окна консоли. Дисплейный буфер может быть скроллирован относительно окна, так что левый верхний угол окна не обязательно будет иметь координаты (0,0) в дисплейном буфере. Для получения координат мыши относительно координатной системы окна необходимо вычесть начальные координаты окна (the window origin coordinates) из координат мыши. Для получения этих начальных координат окна используйте функцию GetConsoleScreenBufferInfo().

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

typedef struct _MOUSE_EVENT_RECORD { // mer

COORD dwMousePosition;

DWORD dwButtonState;

DWORD dwControlKeyState;

DWORD dwEventFlags;

} MOUSE_EVENT_RECORD;

Член dwButtonState структуры MOUSE_EVENT_RECORD имеет бит, соответствующий каждой кнопке мыши. Если бит равен 1, то кнопка нажата, 0 – не нажата. Отпускание кнопки мыши обнаруживается по нулевому значению члена dwEventFlags структуры MOUSE_EVENT_RECORD и изменению значения бита кнопки с 1 на 0. Функция GetNumberOfConsoleMouseButtons() возвращает число кнопок мыши.

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

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

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

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

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