Форум: "WinAPI";
Текущий архив: 2003.01.02;
Скачать: [xml.tar.bz2];
ВнизIE как IWebBrowser Найти похожие ветки
← →
saniok (2002-11-12 12:22) [0]Здравствуйте!
У меня вопрос! Я хочу запустить интернет эксплорер из своей программы, а потом работать с ним, как с IWebBrowser2. Как делать, что читать, с чего начать?
← →
int64 (2002-11-12 13:52) [1]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;
← →
saniok (2002-11-13 13:33) [2]Это хорошее решение, спасибо!
Но мне обязательно нужно запустить IE через CreateProcess, возможно ли как нить получить такой доступ к нему?
А можно как-нить можно его окно присвоить TWebBrowser? Чтобы он показывал то же самое, что и ентот интернет эксплорер?
← →
Ihor Osov'yak (2002-11-13 17:55) [3]eще вариант
Iwb := CreateOleObject("InternetExplorer.Application.1") as IWebBrowser2;
Правда, с нотификацией тут немножко посложнее - нужно "ручками"
подписываться на нотивикацию. Но более универсально, так как если не ошибаюсь, TInternetExplorer появился в IE5, в четвертом еще не было ...
← →
int64 (2002-11-13 18:46) [4]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. И, как правило, предоствляет его с дистрибутивами.
← →
saniok (2002-11-13 19:57) [5]>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-14 02:43) [6]
> Что-то я не так делаю?
Ну ещё бы, вместо хендла окна - хендл процесса ставить.
И не мешало бы проверять Brows после создания на <>nil.
← →
Opuhshii (2002-11-14 14:21) [7]Ishellwindows, и неважно кто запустил IE
← →
saniok (2002-11-14 21:09) [8]>int64
Согласен, но как по хендлу процесса получить хендл окна?
← →
Ihor Osov'yak (2002-11-15 13:14) [9]2 int64 © (13.11.02 18:46)
> Надо двигать технологии вперёд. Пусть все ставят IE6, и
> не забивают голову всякой ерундой. :)
> Время такое, что даже неуважающая себя программа при инсталяции,
> если юзает IE, требует необходимую версию этого IE. И, как
> правило, предоствляет его с дистрибутивами.
Ну, предположим заказчик доволько часто ставит условие IE4 compatible.
Во вторых, есть два очень интересных бага в IE6, касающихся referral через OnNewWindow и OnDocumentComplete, напрочь отсуствующих в IE5 (в ie5.5 есть только проблемЫ с referral).
Для борьбы с которымы нужно несколько извращатся.
Это так, про двигание новых технологий.
← →
saniok (2002-11-16 15:21) [10]вопрос не снят
как в данном случае по хендлу процесса получить хендл окна?
← →
Ihor Osov'yak (2002-11-17 01:23) [11]П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;
← →
kostik78ua (2002-11-17 01:33) [12]Поможет или нет - не знаю, но окно эксплорера ищется так
WindowHandle:=FindWindow("IEFrame",nil);
правда функция найдет первое попавшееся окно эксплорера, но все же... :)
← →
int64 (2002-11-17 02:41) [13]Ihor Osov"yak © (15.11.02 13:14)
То было всего лишь моё имхо.
Новые технологии - новые грабли. Но стоять на месте - себе дороже. Проверено.
А если заказчик привередничает, или "лучше знает", то пусть доплачивает, и получит своё.
saniok (16.11.02 15:21)
Для твоей задачи:
Перебири все окна класса "IEFrame".
Для каждого получи его ThreadId и ProcessId функцией GetWindowThreadProcessId.
Если они совпадают с id-ми процесса, значит нашли.
Пару моментов.
Окно создастся не сразу после createProcess, делай Sleep.
Попап окно (н. ctrl+n) создастся в том же процессе, но в другом потоке.
← →
Ihor Osov'yak (2002-11-17 14:04) [14]2 int64 © (17.11.02 02:41)
> А если заказчик привередничает, или "лучше знает", то пусть
> доплачивает, и получит своё.
Полностью согласен. Но у меня наиболее скромные по цене "IE5 compatible". IE6 compatible обходятся даже дороже, чем IE4.
Зы. А унас с Вами несколько сходная специализация? Во всяком случае одна ветка.. :-)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.01.02;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c