Шаг 51 - GetMessage()

Эта функция извлекает сообщение из очереди.

BOOL GetMessage
(
	LPMSG lpMsg, // указатель на структуру
	HWND hWnd, // указатель окна чьи сообщения нужно обрабатывать
	UINT wMsgFilterMin, // номер мимимального сообщения для выборки
	UINT wMsgFilterMax // номер максимального сообщения для выборки
);

С помощью переменной hWnd есть возможность указать конкретное окно, от которого будет принято сообщение. Если установить это значение в NULL, то будут приниматься все сообщения. Возврат этой функции будет отличен от нуля пока не будет получено сообщение WM_QUIT. Это дает возможность вроде как организовать цикл в программе типа:

while(GetMessage(:)
{
	//...
}

Эта функция кстати может завершиться ошибкой, то есть вернуть -1. А вот тут-то мы сразу и видим, что вышеуказанный код неверен и может привести к ошибке в приложении. Правда во всех книгах он описан, так как и у меня. Странно однако. Ну ладно. Хотя пренебрежение этим как пишет Microsoft может привести к фатальной ошибке "синий экран" и все такое. Эта функция блокирующая, то есть она блокирует приложение до того момента пока не будет получено сообщение, но в этот момент передается управление Windows для выполнения других приложений. Последние параметры устанавливают фильтр на сообщения. Если оба их поставить в 0б то будут приниматься все сообщения. Откуда же в Windows вообще берутся сообщения ??? Вот примерно такая схема.

51_1.gif (3761 b)

Итак, Windows получает сообщения от устройств типа клавиатуры, мыши, таймера и так далее. Естественно, что у каждого этого устройства есть драйвер, который и умеет сам работать с оборудованием. Сообщение попадает в очередь Windows, из которой уже сообщение передается в очередь сообщений приложения. Само приложение уже выбирает сообщения, используя GetMessage(). Как Windows узнает кому надо оправить сообщение, то есть в чью очередь??? Для клавиатуры и мыши просто. У кого фокус ввода, тот и получит сообщение. На картинке ниже сообщения от клавиатуры будет получать блокнот. Он сверху и у него фокус.

51_2.gif (3511 b)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 19.01.2001