
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
![]() |
Сообщ.
#1
,
|
|
Из основной программы запускаем эксплорер (соответственно, иммем его хэндл),
и подсовываем ему на вход нужный html-файл. Юзер в браузере нажал шифт при клике на ссылку -> породился еще один эксплорер со своим окном.... Допустим, наплодили мы кучу новых окон от родительского браузера. Теперь начинаем их закрывать... Вопрос: как главная программа _без_использования_хуков может узнать, что _все_ дочерние окна/процессы закрыты, в том числе и окно "главного" браузера? После закрытия всех порожденных окон наша программа должна завершиться сама. Думаю, надо копать в сторону EnumChildWindows и EnumChildProc ... Можете помочь кусочком рабочего кода? |
Сообщ.
#2
,
|
|
|
Через эти функции, по-моему, муднова-то. Проще в цикле проверять активное окно(GetForegroundWindow), далее получать его текст (GetWindowText(h:THandle)), и сравнивать, не эксплорер ли он.
По-моему, все окна эксплорера-это отдельные процессы, а не дочерние окна главного. Поэтому EnumChildWindows(или как там она) не подойдёт. Но я могу и ошибаться. А сли я ошибаюсь, то так: сначала определяешь хандел родительского эксплорера(это, надеюсь, ты сможешь), например он будет h. А далее так: Function EnumChildProc(Handle:HWND; Param:LongInt):Boolean; stdcall; Begin {сюда через переменную Handle будут передаваться все дочерние окна, а там уже проверяй заголовок окна, если он есть(у кнопок его естественно нет, а они сюда тоже передадуться)} Result:=True; End; Procedure TForm1.Button1Click(Sender:TObject); Begin EnumChildWindows(h,@EnumChildProc,0); End; Но я не уверен, что это именно то, что тебе надо. Так что прошу, если чё, меня строго не судить ![]() |
Сообщ.
#3
,
|
|
|
Вообщем решение есть, но мне его пока не написать по той причине что весь день на работе, а там даже компа нет пока, чтобы реализовать. Но если не терпится, можешь сам попробовать:
1.Запускаем сервер и браузер (ShellExecute). 2.Подождём пока загрузится страница в браузер - WaitForInputIdle() 3.Читаем дискриптор окна браузера - GetForeGroundWindow и определяем его класс, ну типа TOpera :-)) 4.Запускаем нить - TThread, которая будет сканировать все верхние окна - EnumWindows(), на предмет того, есть ли окно с классом, который мы нашли на шаге 3. 5.Если после перебора всех окон, такого окна не нашлось, значит все экземпляры таких окон (то бишь все окна браузера) закрыты.Закрываем сервер. 6.Разрушаем поток. |