программный ввод текста чужому окну

Тема в разделе "WASM.WIN32", создана пользователем warsem, 20 сен 2007.

  1. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Данную функцию не рекомендую юзать.
    Она использует недокументированную BuildHwndList, которую перехватывают некоторые программы в целях скрытия окон (например, HideToolz от ms-rem'a). Гораздо проще и надежнее использовать GetWindow, которая пробегается прямо по массиву окон, а он, в свою очередь, единственный в системе и менять что-то в нем нельзя. Таким образом, мы гарантированно получим ВСЕ нужные нам окна.
     
  2. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Twister
    Насчет не рекомендую и гарантированно - это вы погорячились. Даже MSDN признает известную ненадежность GetWindow, см. Remarks к EnumWindows, GetWindow.

    А с другой стороны - наличие GetWindow показывает, что некоторым программам нефига палить EnumWindows: окна этим все равно не спрячешь.
     
  3. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    Что-то мне этот EnumWindows возвращает куча всего. И половина из этого пустые строчки. Или часто повторяющиеся :dntknw: Может есть фильтр какой?
     
  4. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    Подскажете?
     
  5. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Я не видел твоего кода, посему не могу сказать, что это - кривые руки или, действительно, глюк. Но, помнится, еще несколько лет назад я заметил, что EnumWindows не всегда возвращает валидную инфу. Опять же, сейчас уже трудно сказать кто тогда протупил, но эту проблему я взял себе на заметку.
    Ну на счет "не рекомендую" - это мое сугубо личное мнение (выше отписал почему). А на счет гарантированности могу сказать, что GetWindow напрямую разбирает оконные структуры и вероятность ошибки стремится к нулю. Возможно, что каким-то извратным способом получилось создать окно с противоречивым набором флагов и GetWindow запоролась. Но это все лирика - на моем веку эта функция не проглючила ни разу и всегда возвращала все окна.
     
  6. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    Код (Text):
    1. EnumWindowsProc PROC hwnd:HWND,lParam:LPARAM
    2.     Invoke  GetWindowText,hwnd,offset buffer,256
    3.     mov buffer[eax],0
    4.     Invoke  MessageBox,0,offset buffer,0,0
    5.    
    6.     ret
    7. EnumWindowsProc ENDP
    8.  
    9. start:
    10.     .while TRUE
    11.         Invoke  EnumWindows,addr EnumWindowsProc,0
    12.         .break .if  eax==FALSE
    13.     .endw
    14.     Invoke  ExitProcess,0
    15. end start
    Ну что такое buffer я думаю ясно.
    Вот, этот код возвращает иногда реальные имена окон, а иногда просто пустые строки.
    И еще хотел бы узнать, как например поставить фильтр, чтобы мне возвращало, например, только окна, которые на рабочем столе.
    Я думаю что это нужно вызвать какой-то метод, типа ЭтоОкноРабочегоСтола(hwnd)? Но найти что-то не смог...
     
  7. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    поможете?
     
  8. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    ЭтоОкноРабочегоСтола(hwnd)
    эхм.. разве enumwindows итак не даёт только окна текущего десктопа?..

    и то что тебе отдаются пустые строке, мб это просто toolwindows? или диалоги со скинаме..?
    ПЩПЩ преём..
     
  9. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    А тогда еще пару вопросов:
    1) Можно как то узнать, есть ли у окна наследники? Т.е. для того, чтобы узнать, есть ли у окна родители, есть метод IsChild. А Есть что-то такое про наследников?
    2) Метод EnumWindow, Как его вызывать, чтобы узнать, когда все окна пролистались?
    Т.е. если вызывать его в цикле while-true, то он будет крутить окна по кругу без перерыва, а запоминать первое окно, и каждый раз сравнивать его с текущим, чтоб остановить цикл, как-то не прикольно кажется.
     
  10. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    У окна есть флаг, отвечающий за это. Но средствами АПИ его не вытащить. Остается только GetWindow с GW_CHILD
    EnumWindows вызывает callback-процедуру. Как перестанет вызывать, так окна и кончились... ;)
     
  11. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    В каком цикле тогда нужно вызывать EnumWindows? Я вызываю в while TRUE, так что мне необходимо условие остановки. По МСДН, это условие, если функция EnumWindowProc возвращает FALSE. А т.к. функцию я сам пишу, то и возвращать FALSE, я должен тоже сам, изходя из какого-то условия, о котором я и спрашиваю. Или тогда вызывать в каком-то другом цикле?
     
  12. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    EnumWindows будет вызывать callback до тех пор, пока не будут перечислены все окна верхнего уровня, либо пока ты сам не вернешь FALSE
     
  13. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Lex2029
    Попробуй вызвать эту функцию:
    BOOL EnumChildWindows(

    HWND hWndParent, // handle to parent window
    WNDENUMPROC lpEnumFunc, // pointer to callback function
    LPARAM lParam // application-defined value
    );
     
  14. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Медленно и неоптимально. Юзай GetWindow.
     
  15. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    С этим уже после вашего первого совета разобрался.
    А на счет EnumWindow, то он не возвращает FALSE мне :dntknw:

    Т.е. я делаю цикл

    .while TRUE
    Invoke EnumWindows,offset EnumWindowsProc,NULL
    .break .if eax==FALSE
    .endw

    EnumWindowsProc PROC hwnd:HWND,lParam:LPARAM
    push eax
    ...
    pop eax
    ret
    EnumWindowsProc ENDP

    И мне просто прокручивает все окна по кругу, бесконечно! Если я сам специально не сделаю mov eax,0.
    В чем ошибка?
     
  16. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    Все я понял :) EnumWindows, нужно вызывать не в цикле. Он сам внутри себя сиклируется :)
    Спасибо!
     
  17. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Twister
    И доказать сможете ?