Поддержка работы с мышью в консольном приложении.




Одной из особенностей консольных приложений является поддержка работы с мышью с использованием 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 <операнд>, <номер_разряда>


 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: