Windows является многозадачной средой - в ней одновременно (параллельно) могут быть запущены сразу несколько приложений. Если в однозадачной среде приложение само отслеживает действия, происходящие с устройствами ввода и вывода, то в многозадачной среде эту функцию полностью берет на себя операционная система. Она осуществляет это централизованно для всех выполняющихся в данное время задач. Изменения в состоянии аппаратных средств, самой операционной системе, других исполняющихся в данный момент приложениях, которые могут оказать воздействие на ход выполнения задачи, называются событиями. Приложения извещаются о событиях через сообщения, которые им посылает Windows.
Вся система Windows построена на передаче, приеме и обработке сообщений. Вместо непосредственного контроля за состоянием устройств ввода-вывода приложение должно ожидать поступления соответствующего сообщения от операционной системы. Значительная часть программирования в среде Windows заключается в выборе сообщений, которые будут обрабатываться, и написании соответствующего кода для их обработки. Windows создает специальные очереди сообщений, в которые направляются сообщения для приложений. Приложения, в свою очередь, должны выбирать сообщения из этой очереди и обрабатывать их соответствующим образом; кроме того, они сами могут при необходимости посылать сообщения операционной системе и другим выполняющимся в данный момент приложениям.
В прошлый раз мы построили приложение, которое создает окно и входит в бесконечный цикл. Но в этом цикле оно не делает ничего полезного; а система тем временем создает для приложения очередь сообщений и начинает посылать туда для созданного окна сообщения, которые не только не обрабатываются, но даже и не забираются из этой очереди. Именно поэтому указатель мыши в пределах нашего окна принимал форму ожидания - Windows "наивно" полагала, что сообщения не забираются из очереди, потому что приложение занято какой-то длительной операцией.
Настало время исправить это положение. Для получения сообщения из очереди существует функция GetMessageA из модуля User32.dll. Эта функция перемещает очередное сообщение из очереди в структуру типа MSG, адрес которой мы указываем в параметрах. Структура MSG имеет следующее строение: