Показать сообщение отдельно
  #4  
Старый 17.04.2009, 20:19
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

одинадцатый, объяснять подробно не буду: все ответы, как я уже говорила, можно найти в Windows SDK и в книжечках.

Поясняю коротко (по сути перевожу то, что написано в справке): функция EnumThreadWindows перебирает все окна, ассоциированные с потоком, дескриптор которого ей передается в первом параметре (у нас _pi.dwThreadId). Второй параметр — указатель на ту самую callback-функцию, которую мы объявили как EnumThrWndProc (символ @ как раз и означает, что это указатель). Функция EnumThreadWindows вызывает эту callback-функцию всякий раз, когда находит очередное окно, принадлежащее данному потоку. В свою очередь callback-функция получает дескриптор найденного окна... Последний параметр можно использовать по своему усмотрению, чем я и воспользовалась (передаю текущий индекс массива Handles).

Цитата:
Сообщение от одинадцатый
По поводу задержки которая должна быть: нельзя ли как нибудь сделать чоб моя прога при этом не висла?
Я не знаю, почему виснет ваша программа. Поясню еще раз, что задержка дает время запускаемой программе на создание ее окон и прочее. Если задержки не будет, наша функция-переборщик EnumThreadWindows быстро отработает, не дождавшись появления нужных нам окон, и ничего не найдет, что логично.
Если процедура Sleep, которую я использовала, слишком загружает вашу программу, есть альтернативный вариант создания задержки:
Код:
Hndl := CreateEvent(nil, False, False, nil);
WaitForSingleObject(Hndl, 1000);
CloseHandle(Hndl);
Переменная Hndl имеет тип THandle.

Цитата:
Сообщение от одинадцатый
ваш метод мне выдает хэндл этого окошечка, а надо главной формы.
Я подумаю на этот счет. Вообще, если верить справке, EnumThreadWindows перебирает лишь окна, не являющиеся дочерними, так что пока что кажется странным, что получен дескриптор дочернего...
Ответить с цитированием