Механизм обработки сообщений windows

Вопрос 2. Механизм сообщений в ОС Windows : назначение, принципы функционирования, структура сообщения, программные приемы обработки сообщений. Пример программы, выводящей в окне слово «ТЕСТ — ОК» при щелчке правой клавиши мыши, если нажаты на клавиатуре

Добавил: DMT
Дата создания: 30 декабря 2007, 18:55
Дата обновления: 9 января 2008, 23:29
Просмотров: 14904 последний сегодня, 16:19
Комментариев: 1

Вопрос 2. Механизм сообщений в ОС Windows : назначение, принципы функционирования, структура сообщения, программные приемы обработки сообщений. Пример программы, выводящей в окне слово «ТЕСТ – ОК» при щелчке правой клавиши мыши, если нажаты на клавиатуре клавиши Ctrl + Shift + Alt .

Windows основана на передаче сообщений ( message ). В основе системы лежит механизм, транслирующий практически каждое событие в сообщение. Типичное приложение построено на основе цикла сообщении , который принимает эти сообщения и отправляет их к соответствующим функциям — обработчикам сообщений.

Хотя сообщения передаются приложениям, они адресованы окнам, представляющим некую абстрактную сущность, через которую взаимодействуют пользо­ватель и приложение.

Передача сообщений — это способ, при помощи которого в Windows организован обмен информацией между отдельными подсистемами, приложениями или между отдельными модулями одного и того же приложения. Каждое Windows-приложение построено на основе цикла сообщений. Цикл сообщении повторно вызывает функции GetMessage или PeekMessage и получает сообщения, которые затем передает оконной процедуре через функцию DispatchMessage .

Сообщение представляет собой структуру данных:

Сообщения могут быть отправлены или посланы приложению. Отправленные сообщения помещаются в очередь сообщений, из которой функции GetMessage или PeekMessage получают эти сообщения. В п po тивоположность этому посылка сообщения означает немедленный вызов оконной процедуры, обходя очередь сообщений и цикл сообщений.

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

Windows содержит в себе системную очередь сообщений, куда последние могут поступать от драйверов устройств ввода/вывода или от приложений, а также несколько очередей сообщений для каждого приложения.

Идентификаторы сообщений задаются в заголовочных файлах Windows . Сообщения представляются каждым простым событием, каждое простое действие посыла­ется окну для обработки. Вместо обработки всех возможных сообщений приложение имеет свободу выбора; необработанные сообщения передаются в функции обработки сообщений операционной системы по умолчанию.

Уникальный идентификатор сообщения можно получить вызовом функции RegisterWindowMessage . Использование собственных типов сообщений позволяет частям приложения связываться между собой; разные приложения также могут обмениваться информацией таким способом.

По мере генерации приложениями, сообщения попадают вначале в общую системную очередь и затем распределяются в очереди отдельных приложений. Действие, выполненное над любым органом управления, приводит к генерации соответствующего сообщения и помещения этого сообщения в очередь приложения. Приложение Windows постоянно анализирует содержимое своей очереди сообщений. Когда в очереди появляется сообщение от какого-либо органа управления, приложение выполняет соответствующее действие. В очередь сообщений приложения Windows заносит сообщение, содержащее идентификатор использованного органа управления. Приложение анализирует очередь сообщений и выполняет обработку сообщений. В Windows используется многоуровневая система сообщений.

Сообщения низкого уровня вырабатываются передаются операционной системе Windows, которая на их основе формирует сообщения более высокого уровня.

Операционная система Windows направляет сообщение от использованного органа управления в очередь того приложения, к которому принадлежит данный орган управления. Каждое приложение занимается обработкой своей очереди сообщений, а Windows заботится о том, чтобы все сообщения попадали в нужную очередь.

Так как все приложения используют совместно общий экран видеомонитора, работая каждое в своем окне, Windows обеспечивает обработку ситуаций, при которых одно окно перекрывает другое.

Пример программы, выводящей в окне слово «ТЕСТ – ОК» при щелчке правой клавиши мыши, если нажаты на клавиатуре клавиши Ctrl + Shift + Alt .

Механизм сообщений в Windows

Цель работы

Целью данной работы является ознакомление с механизмом сообщений в операционной системе 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; // положение курсора мыши

Здесь 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, не использующую сообщений. Однако в этом случае работать с оконным интерфейсом будет невозможно.

Дата добавления: 2015-09-15 ; просмотров: 22 ; Нарушение авторских прав

Операционная система Microsoft Windows 3.1 для программиста

1.4. Обработка сообщений

Откуда берутся сообщения?

Большинство сообщений создают драйверы устройств ввода/вывода, таких, как клавиатура, мышь или таймер. Драйверы создают сообщения при поступлении аппаратных прерываний. Например, когда вы нажимаете и затем отпускаете клавишу, драйвер обрабатывает прерывания от клавиатуры и создает несколько сообщений. Аналогично сообщения создаются при перемещении мыши или в том случае, когда вы нажимаете кнопки на корпусе мыши. Можно сказать, что драйверы устройств ввода/вывода транслируют аппаратные прерывания в сообщения.

Куда направляются сообщения, созданные драйверами?

Прежде всего сообщения попадают в системную очередь сообщений Windows. Системная очередь сообщений одна. Далее из нее сообщения распределяются в очереди сообщений приложений. Для каждого приложения создается своя очередь сообщений.

Очередь сообщения приложений может пополняться не только из системной очереди. Любое приложение может послать сообщение любому другому сообщению, в том числе и само себе.

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

Когда вы посмотрите на исходный текст нашего первого приложения, обрабатывающего сообщения, вас может удивить тот факт, что функция WinMain не выполняет никакой работы, имеющей отношение к поведению приложения. Внутри этой функции находятся инициализирующий фрагмент и цикл обработки сообщений (Message Loop). Вся основная работа выполняется в функции окна, которой передаются.

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

Так как Windows — мультизадачная операционная система, ее разработчики должны были предусмотреть механизм совместного использования несколькими параллельно работающими приложениями таких ресурсов, как мышь и клавиатура. Так как все сообщения, создаваемые драйверами мыши и клавиатуры, попадают в системную очередь сообщений, должен существовать способ распределения этих сообщений между различными приложениями.

В Windows существует понятие фокуса ввода (input focus), помогающее в распределении сообщений. Фокус ввода — это атрибут, который в любой момент времени может относиться только к одному окну. Если окно имеет фокус ввода, все сообщения от клавиатуры распределяются сначала в очередь сообщений приложения, создавшего окно, а затем — функции окна, владеющего фокусом ввода. Нажимая определенные клавиши, вы можете перемещать фокус ввода от одного окна к другому. Например, если вы работаете с диалоговой панелью, содержащей несколько окон, предназначенных для ввода текста, с помощью клавиши вы можете переключать фокус с одного такого окна на другое и вводить текст в различные окна диалоговой панели. Существуют также комбинации клавиш, с помощью которых вы можете переключиться на другое приложение. При этом фокус ввода будет отдан другому окну, принадлежащему другому приложению.

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

Простейший цикл обработки сообщений состоит из вызовов двух функций — GetMessage и DispatchMessage.

Функция GetMessage предназначена для выборки сообщения из очереди приложения. Сообщение выбирается из очереди и записывается в область данных, принадлежащую приложению.

Функция DispatchMessage предназначена для распределения выбранного из очереди сообщения нужной функции окна. Так как приложение обычно создает много окон и эти окна используют различные функции окна, необходимо распределить сообщение именно тому окну, для которого оно предназначено. Поэтому приложение должно распределить сообщение после его выборки из очереди приложения, в котором находятся сообщения для всех окон. Windows оказывает приложению существенную помощь в решении этой задачи — для распределения приложению достаточно вызвать функцию DispatchMessage.

Вот как выглядит простейший вариант цикла обработки сообщений:

Завершение цикла обработки сообщений происходит при выборке из очереди специального сообщения, в ответ на которое функция GetMessage возвращает нулевое значение. Тип MSG описан в файле windows.h.

Процесс обработки сообщений схематически показан на рис. 1.9.

Рис. 1.9. Процесс обработки сообщений

На этом рисунке слева показаны ресурсы и подсистемы Windows, справа — приложения. Сообщения поступают от драйверов таких устройств, как клавиатура, мышь, таймер, и попадают в системную очередь сообщений. Из системной очереди сообщений Windows выбирает сообщения, предназначенные для приложения, и помещает их в очередь сообщения приложения.

Функция WinMain в цикле обработки сообщений с помощью функции GetMessage выбирает сообщения из очереди сообщений приложения и распределяет их функциям окон, вызывая функцию DispatchMessage.

На нашем рисунке для простоты показано только одно приложение, в котором определена только одна функция окна. Реально же существует много приложений, и каждое приложение имеет несколько функций окна. Каждое приложение вызывает в цикле обработки сообщений функцию GetMessage, выбирая сообщения из своей очереди. Затем каждое приложение распределяет выбранное сообщение одной из своих функций окна, для чего используется функция DispatchMessage.

Функция окна получает сообщения при создании окна, в процессе работы приложения, а также при разрушении окна.

Сообщение с кодом WM_CREATE передается функции окна в момент создания окна. Функция окна при обработке этого сообщения выполняет инициализирующие действия (аналогично конструктору класса в языке C++). Коды сообщений определены в файле windows.h, включаемом в исходные тексты любых приложений Windows.

В процессе работы приложения функция окна может получать сообщения с различными кодами как через очередь сообщений приложения, так и непосредственно, в обход очереди сообщений. Обработчики этих сообщений, определенные в функции окна, являются методами для работы с окном как с объектом.

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

Читайте также:  Genius ecam 8000 linux
Оцените статью
Читайте также:
  1. II. Некоторые механизмы нейросигнального взаимодействия между особями и популяциями палеоантропов
  2. II. Организация приема сообщений о преступлениях
  3. II. Прием сообщений о преступлениях
  4. III. Организация регистрации сообщений о преступлениях
  5. IV. Организация проверки сообщений о преступлениях
  6. IV. Регистрация сообщений о преступлениях
  7. Oslash; 1. РАБОТА СО СТАНДАРТНЫМИ ПРИЛОЖЕНИЯМИ WINDOWS.
  8. Oslash; 1.1. Общие сведения об операционной системе WINDOWS
  9. Oslash; 1.3. Принципы обмена данными между Windows-программами
  10. Quot;Механизм» Потопа