Одной из особенностей консольных приложений является поддержка работы с мышью с использованием API-функций Windows. Поддержка работы с мышью реализуется с помощью функции ReadConsoleInput. Однако эта функция предназначена для получения информации о событиях не только мыши, но и о событиях клавиатуры, изменении размера окна и т. д. Формат вызова этой функции следующий:
invoke ReadConsoleInput, hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead
где:
hConsoleInput - стандартный дескриптор ввода (полученный функцией GetStdHandle)
lpBuffer - указатель на структурированную переменную, в которую записывается информация о событиях мыши (или о событиях клавиатуры, изменении размера окна и т. д); эта переменная имеет структуру, называемую INPUT_RECORD. Далее будет рассмотрен формат этой структуры. Необходимо заметить, что возможно групповое чтение информации из входного буфера, поэтому указатель lpBuffer может указывать на массив структур; информация о том, сколько событий будет читаться в этот массив структур, определяется следующим параметром – nLength.
nLength - размер структурированной переменной, равный количеству входящих в переменную структур, на которую ссылается указатель lpBuffer;
lpNumberOfEventsRead – указатель на переменную, в которую записывается действительное число прочитанных записей входного буфера.
Врезультате вызова функции ReadConsoleInput в переменную, на которую указывает параметр lpNumberOfEventsRead, будет помещено фактически считанное количество записей о событиях, а в переменную, на которую указывает параметр lpBuffer, будут помещены сами записи с информацией о событиях.
Запись входного буфера консоли имеет структуру, называемую INPUT_REC. Для обработки событий мыши структура INPUT_REC имеет следующий вид:
|
INPUT_REC struct
EventType dw 0
dw 0
dwMousePosition MousePosition <>
dwButtonState dd 0
dwControlKeyState dd 0
dwEventFlags dd 0
INPUT_REC EndS
где поля:
EventType - слово (16 разрядов), которое содержит тип события. Первоначально заполняется нулями. При вызове функции ReadConsoleInput для событий, связанных с использованием мыши, значение этого элемента структуры будет равно 2.
далее в структуре следует неиспользуемое слово - dw 0
dwMousePosition - координаты мыши в окне консоли – двойное слово (32 разряда). Младшие 16 разрядов содержат координату X, а старшие 16 разрядов – координату Y. Для описания координат удобнее использовать вложенную структуру, называемую, например, MousePosition, описанную до INPUT_REC:
MousePosition struct
x_M dw 0
y_M dw 0
MousePosition EndS
dwButtonState — состояние кнопок мыши в момент возникновения события - двойное слово (32 разряда). При нажатии кнопок устанавливаются следующие биты (при одновременном нажатии устанавливается несколько битов):
· если установлен нулевой бит поля dwButtonState в единицу, то в момент наступления события была нажата левая кнопка мыши;
· если установлен первый бит поля dwButtonState в единицу, то в момент наступления события была нажата правая кнопка мыши;
· если установлен второй бит поля dwButtonState в единицу, то в момент наступления события была нажата средняя кнопка мыши, если она есть;
dwControlKeyState - поле описывает состояние управляющих клавиш клавиатуры в момент наступления события мыши (если одновременно нажато несколько клавиш, то значение в этом поле является результатом операции логического сложения (ИЛИ) перечисленных ниже значений):
0001h = RIGHT_ALT_PRESSED — нажата правая клавиша Alt;
|
0002h = LEFT_ALT_PRESSED – нажата левая клавиша Alt;
0004h = RIGHT_CTRL_PRESSED - нажата правая клавиша Ctrl;
0008h = LEFT_CTRL_PRESSED - нажата левая клавиша Ctrl;
0010h = DSHIFT_PRESSED - нажата любая клавиша SHIFT;
0020h = NUMLOCK_ON — индикатор Num Lock включен;
0040h = SCROLLLOCK_ON — индикатор Scroll Lock включен;
0080h = CAPSLOCK_ON — индикатор Caps Lock включен;
0100h = ENHANCED_KEY — нажата клавиша расширенной клавиатуры (101 и 102 клавиши): Ins, Del, Home, End, Page Up, Page Down, Enter и т.д.;
dwEventFlags — поле содержит одно из двух значений:
000lh = MOUSE_MOVED — перемещение мыши;
0002h = DOUBLE_CLICK — выполнен двойной щелчок кнопки мыши.
Задание для самостоятельной работы
Написать программу обработки событий мыши, позволяющую организовать следующую реакцию на манипуляции с мышью в консольном окне:
· нажатие левой кнопки приводит к выводу некоторого сообщения в позиции нажатия
· нажатие правой кнопки влечет за собой завершение работы программы.
При написании программы для определения нажимаемых клавиш использовать команду Ассемблера bt, позволяющую извлечь определенный бит из указанного операнда и поместить его в флаг CF. Формат команды следующий:
bt <операнд>, <номер_разряда>