- •Министерство образования и науки Российской Федерации федеральное агентство по образованию
- •Таганрог 2006
- •Лабораторная работа №1 исследование обмена сообщениями в windows
- •Механизм сообщений в Windows
- •Типы сообщений
- •Цикл приема сообщений
- •Оконные функции
- •Структура очереди сообщений
- •Синхронная посылка сообщений
- •Асинхронная посылка сообщений
- •Выполнение лабораторной работы
- •Пример выполнения задания
- •Варианты заданий
- •Контрольные вопросы
-
Механизм сообщений в Windows
Все операционные системы семейства Windows относятся к типу систем, управляемых событиями. Это означает, что работа прикладных программ строится не в виде непрерывного потока выполнения операций, а в виде реакции программы на определенный набор событий, таких как движение мыши, нажатие клавиши, срабатывание таймера и др., т.е. изменений в состоянии системы и внешних устройств. В системе Windows эти события называются сообщениями (Message), и с каждым сообщением связана структура данных, содержащая информацию, полезную для обработки сообщения. Эта структура на языке C++, описанная в файле WINUSER.H, определяется следующим образом:
/* структура сообщения */
typedef struct tagMSG
{
HWND hwnd; // хэндл окна, которому предназначено
// сообщение
UINT message; // идентификатор (тип) сообщения
WPARAM wParam; // дополнительная информация
LPARAM lParam; // к сообщению
DWORD time; // время посылки сообщения
POINT pt; // положение курсора мыши
} MSG;
Здесь hwnd – числовой описатель (хэндл, handle) окна-получателя. Он присваивается окну при создании. Есть также возможность определить хэндл окна по координатам точки на экране. Допускается специальное значение HWND_BROADCAST, означающее посылку сообщения всем окнам верхнего уровня, существующим в системе (но не дочерним окнам, к которым относятся кнопки, поля ввода и прочие управляющие элементы). Если сообщение послано не окну, а самому процессу (точнее, одной из его нитей), то значение hwnd устанавливается равным NULL.
Идентификатор (тип) сообщения message определяет, что, собственно говоря, случилось. Как правило, в тексте программ тип сообщения указывается в виде одной из многочисленных системных констант, например WM_MOUSEMOVE (0x0200) или WM_TIMER (0x0113).
Идентификаторы сообщений могут принадлежать одному из нескольких диапазонов.
-
С 0х0000 до 0x03FF – системные сообщения, их идентификаторы изначально заданы в OC и не могут быть переопределены.
-
С 0х0400 (константа WM_USER) до 0x7FFF – пользовательские сообщения, которые определяются в приложении и используются для обмена сообщениями между окнами этого приложения. В этом же диапазоне располагаются идентификаторы тех сообщений, которые элементы управления (кнопки, поля ввода, поля со списком, полосы прокрутки и т.п.) посылают своему родительскому окну, оповещая о нажатии пользователем кнопки, выборе из списка и т.п. Сообщения из этого диапазона обычно не посылаются другим приложениям, поскольку те их просто «не поймут».
-
С 0х8000 (константа WM_APP) до 0xBFFF – в Windows версии NT 4.0 и выше данный диапазон также отведен для пользовательских сообщений.
-
С 0хС000 до 0xFFFF – идентификаторы сообщений, определяемых во время исполнения, если пользовательская программа вызывает функцию RegisterWindowMessage.
-
Больше 0xFFFF – идентификаторы, зарезервированные за ОС.
Сообщения, посылаемые элементам управления окна, могут иметь префиксы, отличные от WM_, так, например, BM_ – сообщения для кнопок (Button Messages); LB_ – для списков (ListBoxes).
Параметры wParam и lParam – это 4-байтовые значения, смысл которых зависит от конкретного сообщения.
Параметр time задает время посылки сообщения в миллисекундах от момента запуска операционной системы.
Параметр pt задает экранные координаты курсора мыши в момент посылки сообщения (два целых числа, x и y). Этот параметр важен при обработке сообщений от мыши.
Когда и с какой целью посылаются сообщения? Самый общий ответ на этот вопрос звучит очень просто: они посылаются во всех случаях, когда в работе системы происходит некоторое событие, которое может оказаться важным для какой-либо программы. Задача сообщения – известить о событии «тех, кого это касается». Например, если событие связано с мышью (была нажата или отпущена одна из кнопок либо мышь была перемещена), то система посылает соответствующее сообщение тому окну, на котором в момент события находился курсор. В других случаях сообщение может быть послано конкретно указанной нити или окну либо, наоборот, всем окнам в системе.
Большая часть сообщений Windows (хотя далеко не все сообщения) связана с функционированием системы оконного интерфейса (GUI) – открытием и закрытием окон, изменением их размера и позиции, сменой активного окна, перемещением курсора по окну, нажатием кнопок в окне и т.п.
Система Windows всегда готова к тому, что прикладная программа может не выполнить обработку сообщения (на самом деле, программист обычно использует только некоторые из получаемых его программой сообщений). В этом случае система выполняет некоторую стандартную обработку, предусмотренную для данного типа сообщений, либо не выполняет никаких действий.
Строго говоря, можно написать программу для Windows, не использующую сообщений. Однако в этом случае работать с оконным интерфейсом будет невозможно.
