InternetExplorer(ActiveX)

tors
Дата: 11.12.2007 11:59:18
Импортировал зверя в делфи 7
Определяю события :
InternetExplorerNewWindow2
InternetExplorerQuit
Я дмаю, что события контрола должны работать глобально для всех окон IE
Запускаю прогу,
открываю/закрываю IE - не срабатывает.
C ув. Tors
wellwell
Дата: 11.12.2007 13:43:55
Неправильно думал...
tors
Дата: 11.12.2007 13:58:34
А как отследить, например, события открытия новых окон IE?
C ув. Tors
wellwell
Дата: 11.12.2007 17:00:48
Не знаю, никогда не делал...разбираться лень. По идее надо добраться до запущенных экземпляров и дальше ковырять их интерфейсы. Можно вот с этого начать:

uses SHDocVW, MSHTML;

var
 ShellWindow: IShellWindows;
 IWeb: IWebBrowser2;
 spDisp: IDispatch;
 IDoc1: IHTMLDocument2;
 Document: Variant;
 k: Integer;
begin
 ShellWindow := CoShellWindows.Create;
 for k := 0 to ShellWindow.Count do
  begin
   spDisp := ShellWindow.Item(k);
   if Assigned(spDisp) then
    begin
      spDisp.QueryInterface(IWebBrowser2, IWeb);
      if Assigned(IWeb) then
       begin
        IWeb.Document.QueryInterface(IHTMLDocument2, iDoc1);
        if Assigned(iDoc1) then
         begin
          IWeb := ShellWindow.Item(k) as IWebBrowser2;
          Document := IWeb.Document;
          ShowMessage(Document.Title);
         end;
       end
      end;
  end;
end;
tors
Дата: 11.12.2007 20:03:32
Я так примерно так и делаю - это описано в одной из статей DelphiWorld.
Но это прокатит для уже запущенных окон IE
(те окна ie запущены раньше того как в моей проге выполнится этот код)
А если IE запущен позжее?
Те возможно Вы порекомендуете выполнять этот код по таймеру?
Вопервых это некрасиво помойму
Вовторых мне нужно из проги на делфях определить что
на страничке в бразере загружена некая форма
и выполнять некие действия из этой проги при нажатии на субмит- кнопку
Юзер нажмет субмит - а уменя в это время идет отработка по таймеру...

C ув. Tors
wellwell
Дата: 12.12.2007 03:12:39
Опишите точнее что нужно, возможно вы изначально по неверному пути идете. Например можно создать MIME-фильтр, который будет перехватывать каждую загружаемую страницу, и производить какие-л. действия.
tors
Дата: 12.12.2007 08:21:44
Нужно вот что:
исполняемый файл, который способен распозновать поле (для

заполнения) и значение которое введено туда на странице Internet Explorer (v. 7).

А именно, заходим например на страницу

http://www.essentialpim.com/?r=news&pr=newsletter , файл понимает что на странице есть поле для заполнения и ставит туда курсор.

Пишем значение, отправляем форму, И наш исполняемый файл выводит

значение что было отправлено с формой.

Работа только с IE, использовать перехваты клавиатуры и трафика нельзя.
C ув. Tors
wellwell
Дата: 12.12.2007 11:06:23
Пример ниже отлавливает открытие/закрытие IE и событие BeforeNavigate2. Осталось только в обработчике BeforeNavigate2 получить IWebBrowser2 и от него добраться до форм и прочего.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, SHDocVW, MSHTML, StdCtrls, ComObj, ActiveX;

type
 TWebPageEvents = class(TInterfacedObject, IDispatch)
   public
    function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
    function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
    function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
    function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
    procedure BeforeNavigate2(const pDisp: IDispatch; var URL: OleVariant; var Flags: OleVariant; var TargetFrameName: OleVariant; var PostData: OleVariant; var Headers: OleVariant; var Cancel: WordBool); safecall;
   end;

type
  TForm1 = class(TForm)
   Memo1: TMemo;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
  private
   ShellWindows : TShellWindows;
   procedure OnCreateInstance(Sender: TObject; lCookie: Integer);
   procedure OnDestroyInstance(Sender: TObject; lCookie: Integer);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
 ShellWindows := TShellWindows.Create(Self);
 ShellWindows.ConnectTo(ShellWindows.DefaultInterface);
 ShellWindows.OnWindowRegistered := OnCreateInstance;
 ShellWindows.OnWindowRevoked := OnDestroyInstance;
end;

procedure TForm1.OnCreateInstance(Sender: TObject; lCookie: Integer);
begin
 Memo1.Lines.Add('IE launched. Cookie=' + IntToStr(lCookie));
 InterfaceConnect(ShellWindows.Item(ShellWindows.Count - 1), DWebBrowserEvents2, TWebPageEvents.Create, lCookie);
end;

procedure TForm1.OnDestroyInstance(Sender: TObject; lCookie: Integer);
begin
 Memo1.Lines.Add('IE destroyed. Cookie=' + IntToStr(lCookie));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 ShellWindows.Disconnect;
 ShellWindows.Free;
end;

procedure TWebPageEvents.BeforeNavigate2(const pDisp: IDispatch; var URL,
  Flags, TargetFrameName, PostData, Headers: OleVariant;
  var Cancel: WordBool);
begin
 Form1.Memo1.Lines.Add(URL);
end;

function TWebPageEvents.GetIDsOfNames(const IID: TGUID; Names: Pointer;
  NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
begin
 Result := E_NOTIMPL;
end;

function TWebPageEvents.GetTypeInfo(Index, LocaleID: Integer;
  out TypeInfo): HResult;
begin
 Result := E_NOTIMPL;
end;

function TWebPageEvents.GetTypeInfoCount(out Count: Integer): HResult;
begin
 Result := E_NOTIMPL;
end;

function TWebPageEvents.Invoke(DispID: Integer; const IID: TGUID;
  LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo,
  ArgErr: Pointer): HResult;
var
 pdpParams: PDispParams;
 lpDispIDs: array[0..63] of TDispID;
 dwCount: Integer;
begin
  if {((Flags and DISPATCH_METHOD) > 0) and }(DispID = 250) then
   begin
    ZeroMemory(@lpDispIDs, SizeOf(lpDispIDs));
    pdpParams := @Params;
    {Unnamed params}
    if (pdpParams^.cArgs > 0) then
     for dwCount := 0 to Pred(pdpParams^.cArgs) do lpDispIDs[dwCount] := Pred(pdpParams^.cArgs) - dwCount;
    {Named params}
    if (pdpParams^.cNamedArgs > 0) then
     for dwCount := 0 to Pred(pdpParams^.cNamedArgs) do
     lpDispIDs[pdpParams^.rgdispidNamedArgs^[dwCount]] := dwCount;
    BeforeNavigate2(IDispatch(pdpParams^.rgvarg^[lpDispIds[0]].dispval), POleVariant(pdpParams^.rgvarg^[lpDispIds[1]].pvarval)^, POleVariant(pdpParams^.rgvarg^[lpDispIds[2]].pvarval)^, POleVariant(pdpParams^.rgvarg^[lpDispIds[3]].pvarval)^, POleVariant(pdpParams^.rgvarg^[lpDispIds[4]].pvarval)^, POleVariant(pdpParams^.rgvarg^[lpDispIds[5]].pvarval)^, pdpParams^.rgvarg^[lpDispIds[6]].pbool^);
   end;
 Result := S_OK;
end;

end.
tors
Дата: 12.12.2007 11:34:27
OnCreateInstance(Sender: TObject; lCookie: Integer);
OnDestroyInstance(Sender: TObject; lCookie: Integer);
Открываю/ закрываю IE
ноль эмоций - не срабатывают события
C ув. Tors