Win32 в машинных кодах


Сообщения Windows - часть 2


СмещениеРазмер, байтПоле

04Описатель окна, которому предназначено сообщение

44Код сообщения

84Параметр сообщения wParam

0Ch4Параметр сообщения lParam

10h4Время отправки сообщения

14h4Координата x указателя мыши в момент посылки сообщения

18h4Координата y указателя мыши в момент посылки сообщения

Как указывалось в прошлой статье, основной рабочей единицей в Windows является окно, и сообщения посылаются именно окнам. Чтобы самому послать сообщение, нужно указать описатель окна, для которого сообщение предназначено. Эта информация записывается в первое поле структуры. Параметры wParam и lParam содержат дополнительную информацию, которая специфична для каждого кода сообщения. Система добавляет также к каждому сообщению информацию о времени и координатах курсора мыши в момент отправки сообщения.

Функция GetMessageA принимет 4 параметра, которые размещаются в стеке в следующем порядке:

  1. максимальный код сообщения, который принимает функция;
  2. минимальный код сообщения, который принимает функция;
  3. описатель окна, для которого нужно получить сообщение;
  4. адрес структуры MSG, куда должно быть скопировано сообщение.

Первые три параметра образуют фильтр - GetMessageA может отбирать лишь те сообщения из очереди, которые попадают в заданный диапазон или предназначены лишь указанному окну. Если параметры максимального и минимального кодов равны нулю, из очереди извлекаются все типы сообщений. Если равен нулю параметр описателя окна, извлекаются сообщения для всех окон. Обычно первые три параметра всегда равны нулю - фильтрация сообщений не используется.

Переделаем созданное в прошлый раз приложение так, чтобы включить в него вызов функции GetMessageA. Причем сделаем это с некоторым "запасом" - оставим место (в первую очередь, в структурах для импорта) еще для 2 функций, которые нам пригодятся в дальнейшем.

В секции данных нам потребуется лишь зарезервировать место для структуры MSG размером 28 байтов; но, поскольку мы ее разместим после строк по смещению 3020h, а после нее ничего нет, никаких изменений в файл data.txt вводить не потребуется - просто надо запомнить, что адрес структуры (после загрузки ее в память) будет 403020h. Сюда в процессе работы приложения будут копироваться сообщения системы.




Начало  Назад  Вперед



Книжный магазин