Конференция "Corba" » перехват событий MSIE [Delphi, Windows]
 
  • niro © (17.11.09 19:35) [0]
    Всем привет!

    Задача стоит такая: открыть окно MSIE, используя OLE, затем отслеживать когда пользыватель перейдет по какой либо ссылке и произойдет событие OnNewWindow2. Далее необходимо блокировать всплывающее окно и загрузить новую страницу в мой экземпляр браузера.

    Вот код открывающий экземпляр IE:

    program msie1;
    var
     IE: variant;
    begin
    IE := CreateOleObject('InternetExplorer.Application');
    IE.Visible:=true;
    IE.Navigate('http://blablabla.com', 4);
    While IE.Busy do
     begin
     sleep(100);
     end;
    end.

    Дальше необходимо каким то образом перехватить и обработать событие OnNewWindow2, а как это сделать для меня вопрос... Поиск привел лишь к паре исходников на С без коментариев. :( Есть у кого соображения на этот счет?
  • clickmaker © (18.11.09 11:22) [1]
    имхо, проще сымпортить shdocvw.dll и пользоваться классом-оберткой TInternerExplorer.
    При позднем связывании придется с IConnectionPoint иметь дело
  • NIRO © (18.11.09 14:11) [2]

    > имхо, проще сымпортить shdocvw.dll и пользоваться классом-
    > оберткой TInternerExplorer.
    > При позднем связывании придется с IConnectionPoint иметь
    > дело


    Хорошо, я что то видел про этот класс, но так и не разобрался что к чему :(  можно небольшой примерчик с TInternerExplorer?
    И чем так плох IConnectionPoint, как с ним работать???
  • clickmaker © (18.11.09 14:33) [3]
  • NIRO © (18.11.09 17:24) [4]

    > http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1134


    Да, я как раз этот пример и видел, но там рабоа с формой как я понимаю:

    procedure TMainForm.MyBeforeNavigate2(Sender: TObject; var pDisp, URL,
     Flags, TargetFrameName, PostData, Headers, Cancel: OleVariant);
    begin
     Memo.Lines.Add(URL);
    end;

    А мне нужно в консольном приложении, как это сотворить в из консоли???
    Уже который день насилую яндекс, но результат ноль :(
    ХЭЛП!
  • NIRO © (18.11.09 17:31) [5]
    Пытаюсь заставить работать такой код:

    program Project2;

    uses
     Windows,
     Messages,
     SysUtils,
     Variants,
     Classes,
     Graphics, OLEauto, Ole2,
     Controls,
     Forms,
     ActiveX,
     Dialogs,
     ShDocVw,
     MSHTML_TLB in '..\..\..\Program Files\Borland\Delphi7\Imports\MSHTML_TLB.pas';

    var WB: IWebBrowser2;
    IE: TInternetExplorer;
    PointContainer: IConnectionPointContainer;

    procedure MyBeforeNavigate2(Sender: TObject; var pDisp, URL, Flags, TargetFrameName, PostData, Headers, Cancel: OleVariant);
    begin
    ///
    end;

    begin
    CoInitialize(nil);
    IE:=TInternetExplorer.Create(nil);
    IE.Visible:=True;
    IE.OnBeforeNavigate2:=MyBeforeNavigate2;
    IE.Navigate('d:\Internet\update.htm');
    CoUninitialize;
    end.

    Вылазит баг: Incompatible types: 'method pointer and regular procedure'

    Что в этом коде не так?
  • clickmaker © (19.11.09 13:36) [6]
    > Что в этом коде не так?

    type
     TEventHolder = class
     public
       procedure MyBeforeNavigate2(Sender: TObject; var pDisp, URL,
         Flags, TargetFrameName, PostData, Headers, Cancel: OleVariant);

     end;

    var
     EventHolder: TEventHolder;

    begin
     EventHolder := TEventHolder.Create;
     IE.BeforeNavigate2 := EventHolder.MyBeforeNavigate2;
  • NIRO © (19.11.09 14:35) [7]
    Вот спасибо! теперь кое что прояснилось!

    Но если я пытаюсь обработать таким образом сообщение OnNewWindow2, то получаю ошибку: Incompatible types: 'OleVariant' and 'IDispatch'

    type
    TEventHolder = class
    public
    procedure MyBeforeNavigate2(Sender: TObject; var pDisp, URL, Flags, TargetFrameName, PostData, Headers, Cancel: OleVariant);
    procedure MyOnNewWindow2 (Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool);
    end;

    var WB: IWebBrowser2;
    IE: TInternetExplorer;
    PointContainer: IConnectionPointContainer;
    EventHolder: TEventHolder;
    ppDisp: IDispatch;

    procedure TEventHolder.MyOnNewWindow2 (Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool);
    begin
    windows.beep(100,100);
    end;

    procedure TEventHolder.MyBeforeNavigate2(Sender: TObject; var pDisp, URL, Flags, TargetFrameName, PostData, Headers, Cancel: OleVariant);
    begin
    windows.beep(100,100);
    end;

    begin
    CoInitialize(nil);
    IE:=TInternetExplorer.Create(nil);
    IE.Visible:=True;
    EventHolder := TEventHolder.Create;
    IE.OnNewWindow2:=EventHolder.MyOnNewWindow2;
    IE.Navigate('c:\1.html');
    CoUninitialize;
    end.
  • clickmaker © (19.11.09 17:03) [8]
    > получаю ошибку: Incompatible types: 'OleVariant' and 'IDispatch'

    на какой строке?
  • niro © (19.11.09 17:08) [9]

    > на какой строке?


    IE.OnNewWindow2:=EventHolder.MyOnNewWindow2;
  • clickmaker © (20.11.09 17:15) [10]
    а как выглядит сигнатура OnNewWindow2 в tlb?
  • niro © (21.11.09 08:53) [11]
    Я не совсем понял,что такое снгнатура?

    Вот что удалось найти на эту фу-ию в ShDocVw:

    property OnNewWindow2: TInternetExplorerNewWindow2 read FOnNewWindow2 write FOnNewWindow2;
  • clickmaker © (23.11.09 13:41) [12]
    > что такое снгнатура?

    описание метода.
    вот это, короче - TInternetExplorerNewWindow2
  • Niro © (23.11.09 17:46) [13]

    > описание метода.
    > вот это, короче - TInternetExplorerNewWindow2


    Ээ... а как это прикрутить к программе и использовать для перехвата сообщений ???
  • clickmaker © (23.11.09 18:05) [14]
    > как это прикрутить

    ну вот так и прикрутить
    IE.OnNewWindow2:=EventHolder.MyOnNewWindow2;

    описание TInternetExplorerNewWindow2 как выглядит?
    типы параметров совпадают с MyOnNewWindow2?
  • Niro © (23.11.09 21:06) [15]
    Блин, спасибо что навел на путь истенный :)
    Код вроде как заработал, только вот перехватить событие OnNewWindow2 он всеравно не в состоянии...хоть застрелись :(

    program qqq;

    uses
     Windows,
     Messages,
     SysUtils,
     Variants,
     Classes,
     Graphics,
     OLEauto,
     Ole2,
     Controls,
     Forms,
     ActiveX,
     Dialogs,
     ShDocVw,
     MSHTML_TLB in '..\..\..\..\Program Files\Program Files\Borland\Delphi7\Imports\MSHTML_TLB.pas';

    type
    TEventHolder = class
    public
    procedure MyBeforeNavigate2(Sender: TObject; var pDisp, URL, Flags, TargetFrameName, PostData, Headers, Cancel: OleVariant);
    procedure MyOnNewWindow2 (Sender: TObject; var ppDisp: OleVariant; var Cancel: OleVariant);
    end;

    var
    IE: TInternetExplorer;
    EventHolder: TEventHolder;

    procedure TEventHolder.MyOnNewWindow2 (Sender: TObject; var ppDisp: OleVariant; var Cancel: OleVariant);
    begin
    ppDisp:=ie.DefaultInterface;
    end;

    procedure TEventHolder.MyBeforeNavigate2(Sender: TObject; var pDisp, URL, Flags, TargetFrameName, PostData, Headers, Cancel: OleVariant);
    begin
    ///
    end;

    begin
    IE:=TInternetExplorer.Create(nil);
    IE.Connect;
    IE.Visible:=True;
    EventHolder := TEventHolder.Create;
    IE.onBeforeNavigate2:=EventHolder.MyBeforeNavigate2;
    IE.onnewwindow2:=EventHolder.Myonnewwindow2;
    IE.Navigate('c:\1.html');
    sleep(10000);
    end.

    Программа открывает окно IE и... в нем ни чего непроисходит, по истечении паузы 10 сек. моя программа закрывается и после этого загружается страница, а программа то с обработчиком уже закрылась и что делать не ясно... Почему так происходит и как все таки обработать onnewwindow2???
  • clickmaker © (24.11.09 11:34) [16]
    если нужно отслеживать когда пользыватель перейдет по какой либо ссылке, то далеко не факт, что это произойдет через 10 сек.
    Значит нужно организовать ожидание, циклом или объектом синхронизации - зависит от дальнейшей логики программы
  • Niro © (24.11.09 13:03) [17]

    > Значит нужно организовать ожидание, циклом или объектом
    > синхронизации - зависит от дальнейшей логики программы


    Циклом я уже пробывал, пока крутиться цикл, в окно IE страница вообще не загружается, а начинает загружаться только когда моя программа закрывается, чем это вызвано, и что такое объект синхронизации???

    Я вот подумал может после вызыва Navigate('c:\1.html');
    отсоединиться от IE а потом после загрузки страницы обратно подсоединиться но как???
    пробывал так:
    .....
    ie.Navigate('c:\1.html');
    IE.Disconnect;
    //ждем пока загрузиться страница
    IE.connect;
    ..................
    но после этого даже ie.quit; не работает :(
 
Конференция "Corba" » перехват событий MSIE [Delphi, Windows]
Есть новые Нет новых   [118644   +49][b:0][p:0.001]