Есть функция в DLL следующего содержания: Код (Text): GetCurrentFocus proc LOCAL cur_th:DWORD, att_to:DWORD, res:DWORD mov res,0 invoke GetForegroundWindow invoke GetWindowThreadProcessId,eax,0 mov att_to,eax invoke GetCurrentThreadId mov cur_th,eax invoke AttachThreadInput,eax,att_to,1 .if eax invoke GetFocus mov res,eax invoke AttachThreadInput,cur_th,att_to,0 .endif mov eax,res ret GetCurrentFocus endp Весь этот цирк ради того, чтобы отслеживать текущее окно, в котором шурудит пользователь. Есть безоконное однопоточное приложение, которое делает следующее: 1. GetFocus (в доке написано, что надо чего-нибудь вызвать из User32, чтобы сформировалась очередь сообщений) 2. Sleep(5000) (чтобы успеть куда-нибудь кликнуть в целях тестирования) 3. Вызывает GetCurrentFocus 4. Преобразует eax в строку и выводит его в MessageBox'е В общем, если кликнуть в окно RadAsm, пока выполняется Sleep, оно выведет в MessageBox'е не хэндл окна RadAsm, а хэндл того MessageBox'а, в который выводится информация (при том, что МБ по логике еще не существует на момент выполнения GetFocus!) Полностью аналогичный код, но вызываемый по таймеру в гуйном приложении, работает правильно. От чего такой прикол и как сделать, чтобы заработало и в негуйном приложении?
Если проблема и есть то уж явно не в этом коде, потому что эта процедура работает совершенно нормально. Кстати, GetFocus перед Sleep'ом вызывать ненужно так как GetForegroundWindow сама по себе приведет к созданию очереди сообщений.