С данного шага мы начнем рассматривать обработку команд мыши и клавиатуры в консольном приложении.
Возможность обработки команд мыши и клавиатуры в консольном приложении делает их весьма гибкими, расширяя круг задач, которые можно решить в этом режиме.
Прежде, однако, мы рассмотрим одну весьма необычную, но чрезвычайной полезную API-функцию. Эта функция - wsprintfA. Эта функция является неким аналогом библиотечной C-функции printf. Первым параметром функции является указатель на буфер, куда помещается результат форматирования. Второй - указатель на форматную строку, например: "Числа: %lu, %lu". Далее идут указатели на параметры (либо сами параметры, если это числа), число которых определено только содержимым форматной строки. А теперь - самое главное. Поскольку количество параметров не определено, то стек придется освобождать нам! Пример использования этой функции будет дан ниже. Заметим также, что прототипом этой функции для библиотеки import32.lib (TASM32) будет не wsprintfA, a _wsprintfA. Наконец отметим, что если функция выполнена успешно, то в ЕАХ будет возвращена длина скопированной строки.
В основе получения информации о клавиатуре и мыши в консольном режиме является функция ReadConsoleInput. Параметры этой функции:
А теперь подробно разберемся со структурой, в которой содержится информация о консольном событии. Прежде всего заметим, что в C эта структура записывается с помощью типа данных union. Однако при описании этой структуры мы обойдемся без STRUCT и UNION. Отметим также, что в начале этого блока данных идет двойное слово, младшее слово которого определяет тип события. В зависимости от значения этого слова последующие байты (максимум 18) будут трактоваться так или иначе. Те, кто уже знаком с различными структурами, используемыми в C и Макроассемблере, теперь должны понять, почему UNION здесь весьма уместен.
Но вернемся к типу события. Всего системой зарезервировано пять типов событий:
KEY_EVENT equ 1h ; клавиатурное событие MOUSE_EVENT equ 2h ; событие с мышью WINDOW_BUFFER_SIZE_EVENT equ 4h ; изменился размер окна MENU_EVENT equ 8h ; зарезервировано FOCUS_EVENT equ 10h ; зарезервировано
А теперь разберем значение других байт структуры в зависимости от происшедшего события.
На следующем шаге мы разберем значение других байт структуры в зависимости от происшедшего события.