Данную функцию не рекомендую юзать. Она использует недокументированную BuildHwndList, которую перехватывают некоторые программы в целях скрытия окон (например, HideToolz от ms-rem'a). Гораздо проще и надежнее использовать GetWindow, которая пробегается прямо по массиву окон, а он, в свою очередь, единственный в системе и менять что-то в нем нельзя. Таким образом, мы гарантированно получим ВСЕ нужные нам окна.
Twister Насчет не рекомендую и гарантированно - это вы погорячились. Даже MSDN признает известную ненадежность GetWindow, см. Remarks к EnumWindows, GetWindow. А с другой стороны - наличие GetWindow показывает, что некоторым программам нефига палить EnumWindows: окна этим все равно не спрячешь.
Что-то мне этот EnumWindows возвращает куча всего. И половина из этого пустые строчки. Или часто повторяющиеся Может есть фильтр какой?
Я не видел твоего кода, посему не могу сказать, что это - кривые руки или, действительно, глюк. Но, помнится, еще несколько лет назад я заметил, что EnumWindows не всегда возвращает валидную инфу. Опять же, сейчас уже трудно сказать кто тогда протупил, но эту проблему я взял себе на заметку. Ну на счет "не рекомендую" - это мое сугубо личное мнение (выше отписал почему). А на счет гарантированности могу сказать, что GetWindow напрямую разбирает оконные структуры и вероятность ошибки стремится к нулю. Возможно, что каким-то извратным способом получилось создать окно с противоречивым набором флагов и GetWindow запоролась. Но это все лирика - на моем веку эта функция не проглючила ни разу и всегда возвращала все окна.
Код (Text): EnumWindowsProc PROC hwnd:HWND,lParam:LPARAM Invoke GetWindowText,hwnd,offset buffer,256 mov buffer[eax],0 Invoke MessageBox,0,offset buffer,0,0 ret EnumWindowsProc ENDP start: .while TRUE Invoke EnumWindows,addr EnumWindowsProc,0 .break .if eax==FALSE .endw Invoke ExitProcess,0 end start Ну что такое buffer я думаю ясно. Вот, этот код возвращает иногда реальные имена окон, а иногда просто пустые строки. И еще хотел бы узнать, как например поставить фильтр, чтобы мне возвращало, например, только окна, которые на рабочем столе. Я думаю что это нужно вызвать какой-то метод, типа ЭтоОкноРабочегоСтола(hwnd)? Но найти что-то не смог...
ЭтоОкноРабочегоСтола(hwnd) эхм.. разве enumwindows итак не даёт только окна текущего десктопа?.. и то что тебе отдаются пустые строке, мб это просто toolwindows? или диалоги со скинаме..? ПЩПЩ преём..
А тогда еще пару вопросов: 1) Можно как то узнать, есть ли у окна наследники? Т.е. для того, чтобы узнать, есть ли у окна родители, есть метод IsChild. А Есть что-то такое про наследников? 2) Метод EnumWindow, Как его вызывать, чтобы узнать, когда все окна пролистались? Т.е. если вызывать его в цикле while-true, то он будет крутить окна по кругу без перерыва, а запоминать первое окно, и каждый раз сравнивать его с текущим, чтоб остановить цикл, как-то не прикольно кажется.
У окна есть флаг, отвечающий за это. Но средствами АПИ его не вытащить. Остается только GetWindow с GW_CHILD EnumWindows вызывает callback-процедуру. Как перестанет вызывать, так окна и кончились...
В каком цикле тогда нужно вызывать EnumWindows? Я вызываю в while TRUE, так что мне необходимо условие остановки. По МСДН, это условие, если функция EnumWindowProc возвращает FALSE. А т.к. функцию я сам пишу, то и возвращать FALSE, я должен тоже сам, изходя из какого-то условия, о котором я и спрашиваю. Или тогда вызывать в каком-то другом цикле?
EnumWindows будет вызывать callback до тех пор, пока не будут перечислены все окна верхнего уровня, либо пока ты сам не вернешь FALSE
Lex2029 Попробуй вызвать эту функцию: BOOL EnumChildWindows( HWND hWndParent, // handle to parent window WNDENUMPROC lpEnumFunc, // pointer to callback function LPARAM lParam // application-defined value );
С этим уже после вашего первого совета разобрался. А на счет EnumWindow, то он не возвращает FALSE мне Т.е. я делаю цикл .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. В чем ошибка?