Эта функция извлекает сообщение из очереди. BOOL GetMessage ( LPMSG lpMsg, // указатель на структуру HWND hWnd, // указатель окна чьи сообщения нужно обрабатывать UINT wMsgFilterMin, // номер мимимального сообщения для выборки UINT wMsgFilterMax // номер максимального сообщения для выборки );
С помощью переменной hWnd есть возможность указать конкретное окно, от которого будет принято сообщение. Если установить это значение в NULL, то будут приниматься все сообщения. Возврат этой функции будет отличен от нуля пока не будет получено сообщение WM_QUIT. Это дает возможность вроде как организовать цикл в программе типа: while(GetMessage(:) { //... }
Эта функция кстати может завершиться ошибкой, то есть вернуть -1. А вот тут-то мы сразу и видим, что вышеуказанный код неверен и может привести к ошибке в приложении. Правда во всех книгах он описан, так как и у меня. Странно однако. Ну ладно. Хотя пренебрежение этим как пишет Microsoft может привести к фатальной ошибке "синий экран" и все такое. Эта функция блокирующая, то есть она блокирует приложение до того момента пока не будет получено сообщение, но в этот момент передается управление Windows для выполнения других приложений. Последние параметры устанавливают фильтр на сообщения. Если оба их поставить в 0б то будут приниматься все сообщения. Итак, Windows получает сообщения от устройств типа клавиатуры, мыши, таймера и так далее. Естественно, что у каждого этого устройства есть драйвер, который и умеет сам работать с оборудованием. Сообщение попадает в очередь Windows, из которой уже сообщение передается в очередь сообщений приложения. Само приложение уже выбирает сообщения, используя GetMessage(). |