![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
IE как IWebBrowser [D6, Win2k, WinXP]
saniok © (2002-11-12 12:22:00)Здравствуйте!
У меня вопрос! Я хочу запустить интернет эксплорер из своей программы, а потом работать с ним, как с IWebBrowser2. Как делать, что читать, с чего начать?
Ihor Osov'yak (2002-11-17 14:04:00) [1]2 int64 © (17.11.02 02:41)
> А если заказчик привередничает, или "лучше знает", то пусть
> доплачивает, и получит своё.
Полностью согласен. Но у меня наиболее скромные по цене "IE5 compatible". IE6 compatible обходятся даже дороже, чем IE4.
Зы. А унас с Вами несколько сходная специализация? Во всяком случае одна ветка.. :-)
int64 (2002-11-17 02:41:00) [2]Ihor Osov"yak © (15.11.02 13:14)
То было всего лишь моё имхо.
Новые технологии - новые грабли. Но стоять на месте - себе дороже. Проверено.
А если заказчик привередничает, или "лучше знает", то пусть доплачивает, и получит своё.
saniok (16.11.02 15:21)
Для твоей задачи:
Перебири все окна класса "IEFrame".
Для каждого получи его ThreadId и ProcessId функцией GetWindowThreadProcessId.
Если они совпадают с id-ми процесса, значит нашли.
Пару моментов.
Окно создастся не сразу после createProcess, делай Sleep.
Попап окно (н. ctrl+n) создастся в том же процессе, но в другом потоке.
kostik78ua (2002-11-17 01:33:00) [3]Поможет или нет - не знаю, но окно эксплорера ищется так
WindowHandle:=FindWindow("IEFrame",nil);
правда функция найдет первое попавшееся окно эксплорера, но все же... :)
Ihor Osov'yak (2002-11-17 01:23:00) [4]Пpямо - никак. У пpоцесса может быть ну очень много top-level окон. Или воообще не быть.
.. Можешь обратить внимание на EnumThreadWindows.
Юзать примерно так (пишу "теоритически", могут быть опячатки):
function EnumeratorWindow(hWnd: HWND; lParam: LongInt): Boolean; begin
....
end;
procedure EnumThreadWindows(const ThreadId: DWORD);
var param:integer;
begin
...
if EnumThreadWindows(ThreadId, @EnumeratorWindow,
LongInt(@param))) then
begin
....
end;
end;
saniok (2002-11-16 15:21:00) [5]вопрос не снят
как в данном случае по хендлу процесса получить хендл окна?
Ihor Osov'yak (2002-11-15 13:14:00) [6]2 int64 © (13.11.02 18:46)
> Надо двигать технологии вперёд. Пусть все ставят IE6, и
> не забивают голову всякой ерундой. :)
> Время такое, что даже неуважающая себя программа при инсталяции,
> если юзает IE, требует необходимую версию этого IE. И, как
> правило, предоствляет его с дистрибутивами.
Ну, предположим заказчик доволько часто ставит условие IE4 compatible.
Во вторых, есть два очень интересных бага в IE6, касающихся referral через OnNewWindow и OnDocumentComplete, напрочь отсуствующих в IE5 (в ie5.5 есть только проблемЫ с referral).
Для борьбы с которымы нужно несколько извращатся.
Это так, про двигание новых технологий.
saniok (2002-11-14 21:09:00) [7]>int64
Согласен, но как по хендлу процесса получить хендл окна?
Opuhshii (2002-11-14 14:21:00) [8]Ishellwindows, и неважно кто запустил IE
int64 (2002-11-14 02:43:00) [9]
> Что-то я не так делаю?
Ну ещё бы, вместо хендла окна - хендл процесса ставить.
И не мешало бы проверять Brows после создания на <>nil.
saniok (2002-11-13 19:57:00) [10]>int64
Спасибо, но что-то у меня не выходит. Выбрасывает Access violation... Вот код:
st.lpReserved:=nil;
st.lpDesktop:=nil;
st.lpTitle:=nil;
st.dwFlags:=0;
st.cbReserved2:=0;
st.lpReserved2:=nil;
st.cb:=sizeof(st);
createProcess( "c:\program files\Internet Explorer\Iexplore.exe",nil,nil,nil,true,NORMAL_PRIORITY_CLASS,nil,nil,st,st1);
GetIEFromHWND(st1.hProcess, Brows);
HTMLBody(HTMLDocument(Brows.Document).body).innerHTML := "Hello world!"; // а здесь access violation...
Что-то я не так делаю?
int64 (2002-11-13 18:46:00) [11]saniok (13.11.02 13:33)
> Но мне обязательно нужно запустить IE через CreateProcess,
> возможно ли как нить получить такой доступ к нему?
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1037017694&n=0
> А можно как-нить можно его окно присвоить TWebBrowser? Чтобы
> он показывал то же самое, что и ентот интернет эксплорер?
"Зеркалирование" одного приложения другим вещь, конечно, интересная - никогда такого не видел. )
А какой практический смысл?
Ihor Osov"yak © (13.11.02 17:55)
Надо двигать технологии вперёд. Пусть все ставят IE6, и не забивают голову всякой ерундой. :)
Время такое, что даже неуважающая себя программа при инсталяции, если юзает IE, требует необходимую версию этого IE. И, как правило, предоствляет его с дистрибутивами.
Ihor Osov'yak (2002-11-13 17:55:00) [12]eще вариант
Iwb := CreateOleObject("InternetExplorer.Application.1") as IWebBrowser2;
Правда, с нотификацией тут немножко посложнее - нужно "ручками"
подписываться на нотивикацию. Но более универсально, так как если не ошибаюсь, TInternetExplorer появился в IE5, в четвертом еще не было ...
saniok (2002-11-13 13:33:00) [13]Это хорошее решение, спасибо!
Но мне обязательно нужно запустить IE через CreateProcess, возможно ли как нить получить такой доступ к нему?
А можно как-нить можно его окно присвоить TWebBrowser? Чтобы он показывал то же самое, что и ентот интернет эксплорер?
int64 (2002-11-12 13:52:00) [14]uses ..., SHDocVw;
...
procedure TForm1.Button2Click(Sender: TObject);
var IE: TInternetExplorer;
begin
IE := TInternetExplorer.Create(Self);
IE.OnBeforeNavigate2 := MyBeforeNavigate2;
IE.OnNewWindow2 := MyNewWindow2;
.........
IE.Visible:= True;
IE.Navigate("about:<h1>Hi, World</h1>");
end;