2010-11-17 2 views
0

Кто-нибудь знает, где лучше всего пересылать сообщения потоков дочерним элементам управления?Где сообщения с цепочкой потоков WINAPI/MFC

В основном, приложение должно ловить зарегистрированные сообщения потока в диапазоне msg_frst ... msg_last и перенаправлять их на активный кадр/просмотр.

Есть 3 пункта перегрузки в MFC, или так кажется: DefWndProc OnWndMessage PreTranslateMessage

Который является правильным переопределить?

ответ

1

Сообщение, отправленное с помощью PostThreadMessage(), имеет дескриптор окна NULL. Поэтому забудьте о любом из методов окна, DispatchMessage() не собирается их доставлять. Все, что у вас есть, - CWinThread :: PreTranslateMessage().

Но здесь существует большая опасность, это больше не будет вызываться, когда какой-либо код в этом потоке начнет накачивать свой собственный цикл сообщений. Ваши сообщения теперь попадают в ведро бит, потому что другой код теперь вызывает Peek/GetMessage(). Это гораздо более вероятно, чем вы думаете, MessageBox() достаточно. Или COM-модальный цикл. Etcetera.

Вы можете только безопасно использовать PostThreadMessage() для отправки сообщений в поток, который делает не, чтобы создать любые окна. Обходной путь достаточно прост, снабдите поток дескриптором окна, чтобы он мог вызвать PostMessage(). Это может быть скрытое окно, предназначенное для обработки этих сообщений, например.

+0

Ничего себе, не думал об этом :(Теперь я полностью застрял с сообщением, проходящим к дочерним окнам ... – Coder

+0

Wow. При огромном количестве боли я спас вас от этого ответа. Две недели? ? –

Смежные вопросы