- •«Исследование обмена сообщениями в Windows»
- •Механизм сообщений в Windows
- •Типы сообщений
- •Цикл приема сообщений
- •Оконные функции
- •Структура очереди сообщений
- •Асинхронная посылка сообщений
- •Синхронная посылка сообщений
- •Выполнение лабораторной работы
- •Пример выполнения задания
- •Варианты заданий
- •Контрольные вопросы
МИНОБРНАУКИ РОССИИ
Федеральное государственное автономное образовательное учреждение высшего профессионального образования «ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
Факультет автоматики и вычислительной техники
Кафедра математического обеспечения и применения ЭВМ
Руководство к лабораторной работе № 1
«Исследование обмена сообщениями в Windows»
по курсу
«Операционные системы»
Составители: Болотов М.В., Дроздов С.Н.
Для студентов направлений/специальностей
231000 «Программная инженерия»
230100 «Программное обеспечение средств вычислительной техники и автоматизированных систем»
010500 «Математическое обеспечение и администрирование информационных систем»
090302 «Информационная безопасность телекоммуникационных систем»
090303 «Организация и технология защиты информации»
Таганрог 2013
Цель работы
Целью данной работы является ознакомление с механизмом сообщений в операционной системе Windows, способами генерации и обработки сообщений, а также приобретение навыков исследования потока сообщений с помощью программыSpy++.
Основные сведения
Нити и сообщения
Процессы и нити
Перед тем, как приступить к изучению работы механизма сообщений в операционной системе Windows, кратко рассмотрим понятия программы, процесса и нити вWindows.
Программа (приложение) –это набор исполняемых команд, хранящийся вEXE-файле и загружаемый в оперативную память при выполнении.
Процесс– это контейнер для набора ресурсов, используемых для выполнения экземпляра программы. Процесс включает в себя:
виртуальное адресное пространство – диапазон адресов виртуальной памяти, которым может пользоваться процесс;
исполняемую программу – коды команд и данные, размещаемые в виртуальном адресном пространстве;
список открытых описателей («хэндлов») различных системных ресурсов, доступных всем нитям данного процесса;
уникальный идентификатор процесса;
первичную нить;
маркер доступа, идентифицирующий пользователя и привилегии, сопоставленные процессу.
Нить (thread; иногда переводится также «поток») – это последовательность выполнения команд программы в рамках процесса. Каждый процесс содержит, как минимум, одну нить, создаваемую при старте приложения (первичную нить). Первичная нить может порождать дополнительные нити, выполняемые параллельно с нею.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версииNT4.0 и выше данный диапазон также отведен для пользовательских сообщений.
С 0хС000 до 0xFFFF– идентификаторы сообщений, определяемых во время исполнения, если пользовательская программа вызывает функциюRegisterWindowMessage.
Больше 0xFFFF– идентификаторы, зарезервированные за ОС.
Сообщения, посылаемые элементам управления окна, могут иметь префиксы, отличные от WM_, так, например,BM_– сообщения для кнопок (Button Messages);LB_– для списков (ListBoxes).
Параметры wParamиlParam– это 4-байтовые значения, смысл которых зависит от конкретного сообщения.
Параметр timeзадает время посылки сообщения в миллисекундах от момента запуска операционной системы.
Параметр ptзадает экранные координаты курсора мыши в момент посылки сообщения (два целых числа,xиy). Этот параметр важен при обработке сообщений от мыши.
Когда и с какой целью посылаются сообщения? Самый общий ответ на этот вопрос звучит очень просто: они посылаются во всех случаях, когда в работе системы происходит некоторое событие, которое может оказаться важным для какой-либо программы. Задача сообщения – известить о событии «тех, кого это касается». Например, если событие связано с мышью (была нажата или отпущена одна из кнопок либо мышь была перемещена), то система посылает соответствующее сообщение тому окну, на котором в момент события находился курсор. В других случаях сообщение может быть послано конкретно указанной нити или окну либо, наоборот, всем окнам в системе.
Большая часть сообщений Windows(хотя далеко не все сообщения) связана с функционированием системы оконного интерфейса (GUI) – открытием и закрытием окон, изменением их размера и позиции, сменой активного окна, перемещением курсора по окну, нажатием кнопок в окне и т.п.
Система Windowsвсегда готова к тому, что прикладная программа может не выполнить обработку сообщения (на самом деле, программист обычно использует только некоторые из получаемых его программой сообщений). В этом случае система выполняет некоторую стандартную обработку, предусмотренную для данного типа сообщений, либо не выполняет никаких действий.
Строго говоря, можно написать программу для Windows, не использующую сообщений. Однако в этом случае работать с оконным интерфейсом будет невозможно.