У меня два окна. Одно оконное DX8.1. Другое диалоговое. При выборке сообщений диалоговое перестаёт отвечать на запросы и клики. Добавление IsDialogMessage() решило часть проблемы, но само окно упорно висит, хотя DX-ное работает. Вот цикл сообщений. Код (Text): lea esi,msg assume esi:ptr MSG ;message loop is built for maximum speed align 16 @nextmsg: invoke PeekMessage,esi,0,0,0,PM_REMOVE .if eax==NULL invoke OutWinRenderScene,ebx invoke Sleep,1 jmp @nextmsg .endif ;invoke GetMessage,esi,0,0,0 mov eax,[esi].message .if eax!=WM_QUIT invoke IsDialogMessage,[ebx].hParentWin,esi test eax,eax jnz @nextmsg invoke TranslateMessage,esi invoke DispatchMessage,esi jmp @nextmsg ; push esi ; mov eax,dword ptr [DispatchMessage+2] ; push offset @nextmsg ; jmp dword ptr [eax] .endif mov eax,[esi].wParam mov nExitCode,eax А я хочу потом ещё третье окно вводить. Тоже оконное DX. Что делать?
Может бред, но попробуй вместо invoke PeekMessage,esi,0,0,0,PM_REMOVE сделать invoke PeekMessage,esi,0,0,0,PM_NOREMOVE invoke GetMessage, ...
Спасибо, ребята! Я уже сам разобрался. Стал убирать DX вообще - проблема не уходит. Сделал обычный цикл через GetMessage - без изменений. Наконец нашёл, что не указал класс диалогового окна. После этого всё пошло как по маслу. Staier в принципе был близок к решению, но решить было невозможно с имеющейся информацией. _DEN_ Это не бред. Но в моих испытаниях разницы я не заметил. Есть ещё один вариант. Использовать GetQueueStatus(QS_ALLINPUT); Это ещё более быстрый способ узнать ситуацию с очередью сообщений.