К Т П           План занятия                                                              1                                           Страницы  | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 |

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

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

Два последних события ввода, связанные с фокусом ввода и меню, обрабатываются системой и должны игнорироваться приложением. Каждому событию ввода в очереди сообщений соответствует запись типа 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> имеет специальный смысл для системы и поэтому не передается приложению для обработки.

Теперь перейдем к описанию событий, связанных с мышью. Запись для ввода с мыши имеет следующую структуру:
typedef struct _MOUS_EVENT_RECORD {
   COORD dv/Mouse Posit ion;
   DWORD dv/ButtonState;
   DWORD dwControlKeyState;
   DWORD dwEventFlags;
} MOUSE_EVENT_RECORD;
поля которой имеют следующее назначение:
- поле dwMousePosition определяет координаты курсора относительно буфера экрана;
- поле dwButtonstate содержит флаги, которые определяют состояние кнопок мыши. Эти флаги описываются следующими символическими константами в порядке их следования по битам, начиная с младшего бита:
• from_left_ist_button_pressed — нажата самая левая кнопка мыши;
• rightmost_button_pressed — нажата самая правая кнопка мыши;
• from_left_2nd_button_pressed — нажата вторая слева кнопка мыши;
• from_left_3rd_button_pressed — нажата третья слева кнопка мыши;
• from_left_4th_button_pressed — нажата четвертая слева кнопка мыши;
- поле dwControlKeyState определяет состояние управляющих клавиш и может принимать те же значения, что и соответствующее поле в записи key_event_record;
- поле dwEventFlags отмечает тип события и может принимать одно из следующих значений:
• 0 — кнопка мыши нажата или отпущена;
• double click — кнопка мыши нажата второй раз, первое нажатие отмечается 0;
• mouse moved — изменение позиции мыши;
• MOUSE WHEELED — крутится колесо мыши.

В заключение этого раздела рассмотрим события, которые связаны с изме нением размеров окна. Записи, описывающие такие события, имеют еле дующую структуру:
typedef struct _WINDOW_BUFFER_SIZE_RECORD {
   COODR dwSize;
} WINDOW_BUFFER_SIZE_RECORD;

где поле dwSize определяет новый размер буфера экрана в символах.


Предыдущая        В начало страницы       Следующая
2