Фокус с GetFocus - получение хэндла окна из будущего. Почему так и как исправить?

Тема в разделе "WASM.WIN32", создана пользователем CyberManiac, 17 окт 2005.

  1. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Есть функция в DLL следующего содержания:
    Код (Text):
    1.  
    2. GetCurrentFocus proc
    3. LOCAL cur_th:DWORD, att_to:DWORD, res:DWORD
    4.     mov res,0
    5.     invoke GetForegroundWindow
    6.     invoke GetWindowThreadProcessId,eax,0
    7.     mov att_to,eax
    8.     invoke GetCurrentThreadId
    9.     mov cur_th,eax
    10.     invoke AttachThreadInput,eax,att_to,1
    11.     .if eax
    12.         invoke GetFocus
    13.         mov res,eax
    14.         invoke AttachThreadInput,cur_th,att_to,0
    15.     .endif
    16.     mov eax,res
    17.     ret
    18. GetCurrentFocus endp
    19.  


    Весь этот цирк ради того, чтобы отслеживать текущее окно, в котором шурудит пользователь.



    Есть безоконное однопоточное приложение, которое делает следующее:

    1. GetFocus (в доке написано, что надо чего-нибудь вызвать из User32, чтобы сформировалась очередь сообщений)

    2. Sleep(5000) (чтобы успеть куда-нибудь кликнуть в целях тестирования)

    3. Вызывает GetCurrentFocus

    4. Преобразует eax в строку и выводит его в MessageBox'е



    В общем, если кликнуть в окно RadAsm, пока выполняется Sleep, оно выведет в MessageBox'е не хэндл окна RadAsm, а хэндл того MessageBox'а, в который выводится информация (при том, что МБ по логике еще не существует на момент выполнения GetFocus!) Полностью аналогичный код, но вызываемый по таймеру в гуйном приложении, работает правильно. От чего такой прикол и как сделать, чтобы заработало и в негуйном приложении?
     
  2. Julius

    Julius New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2003
    Сообщения:
    42
    Если проблема и есть то уж явно не в этом коде, потому что эта процедура работает совершенно нормально.

    Кстати, GetFocus перед Sleep'ом вызывать ненужно так как GetForegroundWindow сама по себе приведет к созданию очереди сообщений.