ger_kar, как насчёт того, чтобы пропустить написанное не только через автоматический переводчик, но и через призму собственной логики и здравого смысла?
Описанное в документации поведение актуально только для того случая, когда поток, вызывающий SendMessage, и поток, владеющий окном, которому предназначено сообщение — один и тот же поток.
Вот если задействовать логику и привлечь здравый смысл то сразу напрашивается два вывода:
- Если вызывает SendMessage один поток, а окно-получатель сообщения принадлежит другому потоку, то SendMessage не имеет права взывать напрямую WindowProc этого окна, потому что WindowProc должен быть вызван в контексте другого потока. А если эти два разных потока принадлежат ещё и разным процессам, то такой прямой вызов вообще невозможен.
- В случае же, когда отправляющий сообщение поток и получающий сообщение поток — один и тот же, у SendMessage вообще нет никакого другого варианта, кроме как вызывать WindowProc окна-получателя напрямую. Если SendMessage в этом случае не вызовет WindowProc напрямую, а поместит сообщение в очередь и заморозится до тех пор, пока сообщение не обработают, то просто некому будет обработать сообщение, потому что поток, который должен его обработать — то есть текущий поток — заморожен, спит и ждёт внутри SendMessage.
Поэтому SendMessage вызывает WindowProc напрямую только если окно-получатель принадлежит текущему потоку.
Во всех остальных случаях SendMessage кладёт сообщение в очередь и ждёт его обработки.
Причём в рамках потока-получателя такое сообщение обрабатывает не обычным образом: GetMessage никогда не вернёт его вам и не даст вам его пропустить через TranslateMessage->DispatchMessage, потому что нет гарантии, что вы это сделаете, и потому что в этом случае программисту придётся расчитывать и нацеливаться на целых два варианта обработки сообщений, посланных через SendMessage: в одном случае WP бы вызывался напрямую, а в других — через цепочку GetMessage...TranslateMessage...DispatchMessage.
Вместо этого GetMessage (когда её вызывают) при обнаружении сообщений, посланных в очередь с помощью SendMessage, не возвращает такие сообщения вызывающий стороне. Она их обрабатывает сама. И с точки программиста складывается полная иллюзия того, что такое сообщение вообще не попадало в очередь — поскольку GetMessage его никогда не вернёт.
И если вы попытаетесь внутри цикла обработки сообщений между вызовами GetMessage и DispatchMessage с помощью if-а попробовать отследить посланное текущему потоку с помощью SendMessage сообщение — вы его никогда в принципе не отследите. Потому что такое сообщение не проходит через итерацию цикла прокачки сообщений.
Зато попробуйте не вызывать в цикле GetMessage — тогда сообщение, посланное вашему окну с помощью SendMessage, никогда не будет обработано.