| | | | |
Как запустить Internet Explorer или подключиться к нему. | Полный текст материала
Другие публикации автора: Сергей Осколков
Цитата или краткий комментарий: «... В продолжение нескольких статей на Королевстве
о работе с компонентом TWebBrowser хочу затронуть
пару вопросов работы с Internet Explorer, которые
раньше, кажется, не обсуждались. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 6 | 75% | | | | Ничего особенно нового и интересного | [2] | 2 | 25% | | | | Написано неверно (обязательно укажите почему) | [3] | 0 | 0% | | Всего проголосовали: 8 | | | Все понятно, материал читается легко | [1] | 6 | 85.7% | | | | Есть неясности в изложении | [2] | 1 | 14.3% | | | | Непонятно написано, трудно читается | [3] | 0 | 0% | | Всего проголосовали: 7 |
[TWebBrowser] [Интеграция с Internet Explorer]
Отслеживать это обсуждение
Всего сообщений: 2726-06-2020 06:32Спасибо, получается все. А как узнать, что страничка загрузилась полностью?
OnDocumentComplete срабатывает и после того, как ReadyState стало =4 |
|
15-12-2009 04:42сообщение от автора материала его через сообщение передал, однако получил аксекс сразу,
WebBrowser.ControlInterface - это же указатель на интерфейсную переменную в адресном пространстве одной задачи, понятно, что в другом процессе этот указатель не получится использовать. А в COM еще сложнее, если сервер вне вашего процесса, то COM создает некое прокси и дает указатель на него.
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1359
Первая мысль у меня была для идентификации WebBrowser использовать дескриптор окна (Handle), но IWebBrowser2.Hwnd, как пишут, можно использовать для IE, а для WebBrowser дескриптор окна мы так получить не можем. В интернете и даже на сайте microsoft есть материалы, как получить handle (я искал WebBowser.Hwnd)
http://support.microsoft.com/kb/244310
Но первый вариант для C++, приведенный тут, у меня сходу не получился, а дальше копать я не стал. Попробуйте задать свой вопрос на Круглом Столе. Тут много квалифицированных прогрммистов, м.б. кто-то поможет. ) |
|
15-12-2009 02:34Обе программы мои, в одной есть TWebBrowser в другой компонент из этой статьи http://delphiworld.narod.ru/base/ie_intercept_msgs.html
Зачем так сложно не спрашивайте, это пока исследование.
Про WebBrowser.ControlInterface я тоже сначала подумал и тупо его через сообщение передал, однако получил аксекс сразу, потом написал быдлокодерский кусочек
Caption := inttostr(Integer(Pointer(WebBrowser1.ControlInterface))) + ' ' +
inttostr(Integer(Pointer(WebBrowser1.ControlInterface.Parent))) + ' ' +
inttostr(Integer(Pointer(WebBrowser1.ControlInterface.Document))) + ' ' +
inttostr(Integer(Pointer(WebBrowser1.ControlInterface.Container))) + ' ' +
inttostr(Integer(Pointer(WebBrowser1.ControlInterface.Application)));
а вдругом приложении
tmp := inttostr(integer(Pointer(pvWeb2.Application)));
tmp := tmp + ' ' + inttostr(integer(Pointer(pvWeb2)));
tmp := tmp + ' ' + inttostr(integer(Pointer(pvWeb2.Container)));
tmp := tmp + ' ' + inttostr(integer(Pointer(pvWeb2.Parent)));
tmp := tmp + ' ' + inttostr(integer(Pointer(pvWeb2.Document)));
совпадений не нашлось.
ЗЫ Заметил такую вещь - если TWebBrowser.RegistryAsBrowser := false то CoShellWindows не видет это окно, отсюда предположение что когда этот TWebBrowser Регистрируется создается еще какойто ком объект который мы как раз и получаем из ShellWindows, и если мое предположение верно то необходимо из TWebBrowser както это интерфейс получить |
|
15-12-2009 02:21сообщение от автора материала Честно говоря, я не совсем понял ситуацию, кто обращается - Ваша программа с TWebBrowser к другой или наоборот, та к этой. вообще интерфейс, который вы получаете через IShellWindows, это ведь тот самый интерфейс, который в самой программе получается как WebBrowser.ControlInterface.
|
|
15-12-2009 01:12Другими словами как свой TWebBrowser целенаправленно дать в использование другому приложению. |
|
15-12-2009 01:09А как решить такую задачу.
В моем приложении есть TWebBrowser его свойство RegistryAsBrowser := true и поэтому его можно найти CoShellWindows, одноко как мне убедиться в том что найженный там браузер именно он. Сравнение по различного рода урлам и неймам это не вариант, нужен интерфейс или указатель или еще чего.
Моя проблема решилась бы другим путем если бы знать как из компонента TWebBrowser получить тот же интерфейс что получается из CoShellWindows, я бы тогда его на прямую передавал. |
|
20-08-2009 05:07сообщение от автора материала P.S. Естественно, то, что я написал, относится только к отслеживанию навигации в IE. Навигация в других браузерах так отслеживаться не будет. Вообще для отслеживания навигации в сети используются другие средства. |
|
20-08-2009 04:36сообщение от автора материала to malor.
Из общих рекомендаций - такой программе нужно будет реагировать на то, что пользователь перешел на новую страницу и, добавлять при этом новый URL в журнал. Т.е. программа должна реагировать на события COM-сервера. Интерфейсам IShellWindows и IWebBrowser2 соответствуют интерфейсы событий DShellWindowsEvents и DWebBrowserEvents2 соответственно, объявлены они в модуле ShDocVw.
Что-то на эту тему есть в статье http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1319
там в примере можно посмотреть, как клиент может обрабатывать события сервера.
Если будут более конкретные вопросы по вашей задаче, задавайте пожалуйста на Круглом столе, м.б. там кто-нибудь ответит. Если хотите более-менее готовое решение, то наверное стоит писать об этом на Городской площади:
http://www.delphikingdom.ru/notice/
|
|
19-08-2009 12:28Как использовать сведения статьи, например, для отслеживания введенных в IE в адресную строку URL'ов ?
Программа должна функционировать независимо от браузера и заниматься лишь регисрацией сведений(т.е. URL). |
|
01-08-2007 06:46сообщение от автора материала В Viste c IE 7.0 код
...
не работает - в списке Winds присутствуют только окна Explorer-a, окон IE там нет!
В Windows XP SP2 с установленным IE7 этот код работает. Могу предположить, что то, про что вы написали, как-то связано с тем, что в Висте IE 7.0 работает в защищенном режиме (protected mode). |
|
26-07-2007 14:22В Viste c IE 7.0 код
procedure TForm1.Button1Click(Sender: TObject);
var
Winds: IShellWindows;
IEWB: IWebBrowser2;
i: integer;
Doc: IHtmlDocument2;}
begin
{lb.Items.Clear;
Winds:=CoShellWindows.Create;
for i:=0 to Winds.Count-1 do
if (Winds.Item(i) as IWEbBrowser2).Document<>nil then
begin
IEWB:=Winds.Item(i) as IWEbBrowser2;
if IEWB.Document.QueryInterface(IhtmlDocument2, Doc)= S_OK
then lb.Items.Add(Doc.url);
end;
end;
не работает - в списке Winds присутствуют только окна Explorer-a, окон IE там нет! |
|
02-02-2007 04:17
26-06-2006 01:32сообщение от автора материала P.S. На самом деле в Дельфи это делается без единой строчки кода :) . Достаточно при импорте библиотеки типов позволить мастеру сгенерировать компонент-обертку. |
|
24-06-2006 11:34Кто то еще знает как подключится к событиям броузера ? |
|
23-06-2006 09:13сообщение от автора материала Меня пару раз по почте, теперь в обсуждении статьи, просили привести пример или код, как подключиться к событиям уже запущенного IE. Один раз я послал кусок кода, как подключиться к DShellWindowsEvents. Но дело в том, что подключаясь к событиям IE, можно перехватывать отсылаемые данные форм. Вот фраза из одной статьи, где это описано на С++: "Задача - перехватить данные форм IE непосредственно перед отправкой их на сервер через протоколы http и https." Однажды на Городской площади было предложение работы, где, как оказалось, требовалось именно это. Зачем можно перехватывать данные формы, которые посылает пользователь на какой-нибудь сайт, можно догадываться, варианты могут быть разными. Из тех соображений, что это можно использовать для перехвата личных данных, паролей и т.п., я не буду приводить здесь этот код. Пусть меня извинят те, кто планировал использовать его в "мирных" целях. В конце концов задача не такая сложная - как реализовать сток для событий COM, описано в статьях А.Тенцера и в других местах.
|
|
23-06-2006 07:13Отличная статья.
Очень хотелось бы узнать как подключиться к событиям запущенного IE. В частности беспокоят события OnBeforeNavigate и OnNavigateComplete2.
|
|
14-12-2005 08:51Супер!
Искал пример хотябы на С++ нашёл сразу на Д7!
Если будет время сделаю сампл.
Кому выслать?
2-я часть статьи отличная!
( TWebBrowser надоел :) - хотелось чегото остреньокого ) |
|
20-05-2005 07:01шо,шо такое не че не понял хлопьци |
|
18-05-2005 11:01За линки спасибо. Проблему пока решить не удалось, но критическая масса накопленной информации наверное скоро будет достигнута. В продолжение дискусии должен заметить следующее:
>>Насколько я понимаю, событий у окна браузера или у документа при этом не возникает.
Это точно. Вернее сказать, события то возникают, а словить их не удается.
>>Контролировать загрузку отдельных рисунков и выполнение отдельных скриптов, мне кажется, нельзя
А мне кажется, что можно. Взять хотя бы AD-охотник из MYIE. Раз он умеет, то значит это возможно. База то одна и та же - движок MSIE. |
|
18-05-2005 03:54сообщение от автора материала Предыдущее сообщение - мое. |
|
18-05-2005 03:52В частности у меня не получилось перехватить загрузку внешнего скрипта или рисунка.
Насколько я понимаю, событий у окна браузера или у документа при этом не возникает. Контролировать загрузку отдельных рисунков и выполнение отдельных скриптов, мне кажется, нельзя (Насчет скриптов не уверен, какие-то ведь могут выполняться при загрузке, а другие при нажатии на кнопки и т.д.). Чтобы разрешать/запрещать загрузку картинок и выполнение скриптов в целом, нужно в методе IDispatch.Invoke WebBrowser'а реализовать обработку DispID=DISPID_AMBIENT_DLCONTROL.
http://msdn.microsoft.com/workshop/browser/hosting/wbcustomization.asp#Controlling_Download_and_Execution
Пример реализации (с исходниками):
http://www.euromind.com/iedelphi/embeddedwb.htm
Если скрипт выполняется не сразу, то, наверное, можно после загрузки документа его заменить через
IHTMLScriptElement.
Не написал в статье, что про использование интерфейса IShellWindows для подключения к IE прочитал в первый раз в статье Т. Чадова на RSDN (конечно, это есть и на MSDN и в других местах), там везде примеры для C++.Сообщение не подписано |
|
17-05-2005 16:36Материал отличный, но малость "недоразжеван". При использовании стандартных известных из TWebBrowser событий проблем не возникает, но вот как только начинается реальная практика - сразу проблемы. В частности у меня не получилось перехватить загрузку внешнего скрипта или рисунка. Т.е. на странице есть фрагмент типа
<script src=http://domain/name.js></script>
Как подменить или хотя бы просто отменить загрузку этого скрипта средствами IWEbBrowser2 в чужом окне IE (хотя можно и в своем - не суть важно)?
|
|
17-05-2005 11:05сообщение от автора материала <> на <>
Смешно. Второй символ & потом lt; потом & потом gt; (как в примере в статье). Заменяется на html-странице на <>. В предыдущем сообщении автоматом заменился. |
|
17-05-2005 11:01сообщение от автора материала illegial Character &
Я просмотрел, что html-редактор заменил символы <> на <> (для html это одно и то же) внутри тега <pre>. Наверное, вы просто пример скопировали. Думаю, что причина в этом, нужно просто исправить на <>. |
|
17-05-2005 08:44У меня пишет ошибку при компиляции
if (Winds.Item(i) as IWEbBrowser2).Document<>nil then ......
illegial Character &Сообщение не подписано |
|
10-05-2005 19:02>>>Отличный материал.
Ну да. Для ознакомления.
Честно говоря не могу придумать практическое применение браузера в дельфи. |
|
07-05-2005 09:49
|
|