Различные типы обработчиков прерываний ОС должны помещать сообщения в указанную «очередь сообщений», но где в адресном пространстве процесса находится эта очередь? Как он подвергается воздействию кода обработчика прерываний?
Окна связаны с потоками. Каждый поток с окном имеет очередь потока в адресном пространстве процесса. Операционная система имеет внутреннюю очередь в собственном адресном пространстве для событий, генерируемых оборудованием. Используя сведения о событии и другую информацию о состоянии (например, какое окно имеет фокус), ОС преобразует аппаратные события в сообщения, которые затем помещаются в соответствующую очередь потоков.
Публикуемые сообщения помещаются непосредственно в очередь потоков для целевого окна.
Отправляемые сообщения обычно обрабатываются напрямую (в обход очереди).
Детали становятся волосатыми. Например, очереди потоков - это больше, чем списки сообщений - они также содержат некоторую информацию о состоянии. Некоторые сообщения (например, WM_PAINT) на самом деле не ставятся в очередь, а синтезируются из дополнительной информации о состоянии, когда вы запрашиваете очередь, и она пуста. Сообщения, отправленные окнам, принадлежащим другим потокам, на самом деле отправляются в очередь получателя, а не обрабатываются напрямую, но система делает его похожим на обычную блокировку отправки с точки зрения вызывающего Веселость наступает, если это может привести к тупику (из-за циклических пересылок обратно в исходный поток).
В книгах Джеффри Рихтера есть много (всех?) Кровавых подробностей. Мое издание старое (Advanced Windows). Текущее издание, кажется, называется Windows через C / C ++ .
ОС выполняет МНОГО работы, чтобы поток сообщений выглядел рациональным (и относительно простым) для вызывающей стороны.
Что значит «перевести» сообщение? Что в действительности делает вызов TranslateMessage ()?
Он следит за сообщениями виртуальных клавиш и, когда он распознает комбинацию нажатий клавиш / клавиш, добавляет символьные сообщения. Если вы не позвоните TranslateMessage , вы не получите символьные сообщения, такие как WM_CHAR.
Я подозреваю, что он отправляет символьное сообщение непосредственно перед возвратом (в отличие от публикации их). Я никогда не проверял, но мне кажется, что я помню, что сообщения WM_CHAR поступают непосредственно перед WM_KEYUP.
После отправки DispatchMessage (), во всех местах, где проходит сообщение, прежде чем оно достигнет моего WndProc (т. Е. Что ОС делает с ним)?
DispatchMessage передает сообщение в WndProc для целевого окна. Попутно некоторые хуки могут получить возможность увидеть сообщение (и, возможно, помешать ему).