Здравствуйте, Kirill_Luzanov, Вы писали:
KL>
НЕВЕРНО!!! Если поток не вызывает GetMessage или PeekMessage сообщение НИКОГДА не будет обработанно!
KL>SendMessage НЕ ВЫЗЫВАЕТ напрямую оконную процедуру — если бы это было так — то оконная процедура вызывалсь бы
KL>в ТЕКУЩЕМ потоке — а не потоке ВЛАДЕЮЩЕМ очередью сообщений!!!
KL>В WINDOWS ВСЕ СООБЩЕНИЯ ДЛЯ ПОТОКА ОБРАБАТЫАЮТСЯ ТОЛЬКО В САМОМ ПОТОКЕ!
KL>Так что прав — Pek.
Забыл уточнить — SendMessage может вызвать оконную процедуру напрямую ТОЛЬОКО если
она вызывается в родном для окна потоке. Иначе см. выше.
И соотв. слегка изм. псевдокод:
LRESULT SendMessage(HWND hWnd, UINT Msg , WPARAM wParam , LPARAM lParam)
{
DWORD dwThreadID = System::GetWindowNativeThreadID(hWnd);
System::MessageQueue* pQueue = System::GetThreadMessageQueue(dwThreadID);
if(GetCurrentThreadId() == pQueue->GetNativeThredId())
вызывается оконная процедура
else
{
MSG msg(Msg, wParam, lParam)
return pQueue->AddSync(&msg);
}
}
далее смотри мой предыдущий пост...