Входной буфер консоли содержит очередь записей, которые описывают события ввода. События ввода подразделяются на следующие категории:
- ввод с клавиатуры;
- ввод с мыши;
- изменение размеров окна;
- изменение фокуса ввода;
- события, связанные с меню.
Два последних события ввода, связанные с фокусом ввода и меню, обрабатываются системой и должны игнорироваться приложением. Каждому событию ввода в очереди сообщений соответствует запись типа input record, которая имеет следующую структуру:
typedef struct _INPUT_RECORD {
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;
где поле EventType определяет тип события ввода и может принимать одно из следующих значений:
- KEY_EVENT — ввод с клавиатуры;
- MOUSE_EVENT — ввод с мыши;
- WINDOW_BUFFER_SIZE — изменение размеров окна;
- MENU_EVENT — событие, связанное с меню;
- FOCUS_EVENT — изменение фокуса ввода.
В свою очередь объединение Event содержит запись только одного из перечисленных типов в зависимости от значения поля EventType.
Рассмотрим структуру записи для каждого события ввода. Запись для ввода с клавиатуры имеет следующую структуру:
typedef struct _KEY_EVENT {
BOOL bKeyDown;
WORD wRepeat Count;
WORD wVirtualKeyCode;
WORD wVirtualScanCode;
union {
WCHAR UnicodeChar;
CHAR AsciiChar;
} uChar;
DWORD dwControlKeyState;
} KEY EVENT RECORD;
Кратко опишем поля этой структуры:
- значение поля bKeyDown равно true, если клавиша нажата, в противном случае значение этого поля равно false;
- поле wRepeatcount содержит счетчик задержки при нажатии клавиши;
- поле wvirtuaiKeyCode содержит код клавиши, который не зависит от типа клавиатуры;
- поле wvirtuaiscancode содержит код клавиши, который генерируется клавиатурой. Значение этого поля зависит от клавиатуры, т. к. клавиатуры разных производителей могут генерировать различные коды при нажатии одинаковых клавиш;
- объединение uchar содержит символ, который соответствует нажатой клавише. Этот символ может быть представлен как в коде Unicode, так и в коде ASCII;
- поле dwControiKeystate содержит комбинацию флагов, которые описывают состояние управляющих клавиш. Эти флаги могут принимать следующие значения:
• capslock on — включен индикатор <Caps Lock>;
• enhanced_key — дополнительные клавиши;
• left alt pressed — нажата левая клавиша <Alt>;
• left ctrl pressed — нажата левая клавиша <Ctrl>;
• numlock_on — включен индикатор <Num Lock>;
• right_alt_pressed — нажата правая клавиша <Alt>;
• right_ctrl_pressed — нажата правая клавиша <Ctrl>;
• scrolllock_on — включен индикатор <ScoII Lock>;
• shift pressed — нажата клавиша <Shift>.
Замечание: К дополнительным клавишам относится самый правый блок клавиш на клавиатуре, который обычно находится под индикаторами состояния клавиатуры. Кроме того, отметим, что автономное нажатие клавиши <Alt> имеет специальный смысл для системы и поэтому не передается приложению для обработки. |