![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Объясните тупому: после CreateProcess(......., si, pi)
@andrew © (2002-09-18 12:53:00)что у меня лежит в pi.hProcess и как мне это преобразовать в нормальный хендл процесса, чтобы потом SendMessage(?? и т.д.
Большое спасибо. Или я вообще "не о том". А как тогда?
Yegor Derevenets (2002-09-18 16:34:00) [1]Постараюсь в ближайшее время выложить прогу Run. Там все демонстрируется - и под NT и под W9Х.
Digitman (2002-09-18 14:10:00) [2]>@andrew
Воспользуйся советом от <Alx2> - это одно из вполне приемлемых решений.
P.S.
>>Где же ты был раньше
Да покурить выходил).. Пока ты про "хуки" изучал, начитавшишь местных знатоков и поддавшись бездумному ажиотажу : "хукать" вся и все, одним крючком да без разбору)))))
Alx2 (2002-09-18 13:57:00) [3]Можно попробовать завести дополнительно ждущий поток, цель которого - дождаться завершения твоего процесса.
@andrew (2002-09-18 13:50:00) [4]>Digitman
Родной мой! :-) Где же ты был раньше. А я уж изучил хуки :-) ok. Стоп а я получу что хочу: мне надо, чтобы мое приложение работало как работало и лишь в случае завершения запущенного процесса выкидывало месседж. Тобишь как мне дожидаться WAIT_OBJECT_0?
Digitman (2002-09-18 13:42:00) [5]Никакой хук ставить не требуется. Просто вызови одну из ф-ций ожидания сигналов сист.объектов синхронизации (WaitForSingleObject, MsgWaitForMultipleObjects и т.п.), передав ей в кач-ве параметра хэндл процесса, чье завершение ты ожидаешь. Возрат такой ф-цией результата WAIT_OBJECT_0 (в ряде случаев - WAIT_ABANDONED) есть факт завершения интересующего тебя процесса, чей хэндл ты передал в ф-цию в кач-ве параметра - объекта синхронизации.
@andrew (2002-09-18 13:32:00) [6]А.а.а.а.а.а
Ну тогда не подскажите:
Мне бы надо отловить конец этого процесса. Можно ли поставить на завершение процесса хук: какой тип хука должен быть и какой месседж я должен ловить?
Alx2 (2002-09-18 13:20:00) [7]Также можно попробовать GetWindowThreadProcessId и EnumWindows, если о процессе только его хэндл и известен.
Digitman (2002-09-18 13:11:00) [8]В pi.hProcess "лежит" хэндл процесса, а не хэндл окна.
Ф-ция SendMessage() же, будучи предназначенной для посылки сообщений некоему потенциально существующему в системе окну, требует именно хэндл целевого окна (которое может быть создано - а может и не создано - одним из кодовых потоков процесса; например, "пустое" конс.приложение не создает никаких окон, но процесс такого приложения тем не менее имеет хэндл)
Если ты уверен (или предполагаешь), что некий процесс, созданный тобой ф-цией CreateProcess(), создает некое окно, которому ты желаешь послать некое сообщение, ты должен найти это окно среди прочих окон, регистрируемых системой всякий раз, когда некий процесс в некоем своем код.потоке успешно выполняет ф-цию CreateWindow[Ex](). При регистрации окна система фиксирует класс и титульную строку окна (последняя в последствии может быть и изменена процессом-создателем этого окна в любой момент времени).
Эти параметры (оба или хотя бы какой-то один) как раз и следует использовать для поиска существующего окна в системе. Для поиска окна существует ф-ция FindWindow[Ex](), принимающая параметрами ссылки на образцы класса и подписи искомого окна, и возвращающая хэндл окна, если таковое обнаружено системой. Вот этот самый хэндл и следует использовать во всех ф-циях, предназначенных для посылки/приема оконных сообщений.
@andrew (2002-09-18 13:08:00) [9]А на пальцах :-)
Alx2 (2002-09-18 13:05:00) [10]SendMessage хендл окошка просит.
Я после того, как процесс приготавливался к обработке сообщений, смотрел окошки, порождденные его потоками и запоминал их хэндлы. Через них и общались