Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > как получить IWebbrowser2 Interface зная handle


Автор: Smailik 10.5.2006, 14:07
Задача следующая - с помощью скрипта открывается окно IE без панели навигации, строки состояния и с заблоченой правой кнопкой мыши. Приведенная ниже процедура отлавливает все окна IE а это ловить не хочет smile

Код

procedure TForm1.Button2Click(Sender: TObject);
var 
  Hx: THandle;
  P: array[0..256] of Char;
  Item: TListItem;
begin
  ListView1.Items.Clear;
  Hx := FindWindow(nil, nil);
  GetClassName(Hx, P, SizeOf(P));
  if string(P) = 'IEFrame' then begin
    Item := ListView1.Items.Add;
    Item.SubItems.Add(IntToStr(Hx));
    Item.Caption := GetText(Hx);
  end;
  while Hx <> 0 do begin
    Hx := GetWindow(Hx, GW_HWNDNEXT);
    GetClassName(Hx, P, SizeOf(P));
    if string(P) = 'IEFrame' then begin
      Item := ListView1.Items.Add;
      Item.SubItems.Add(IntToStr(Hx));
      Item.Caption := GetText(Hx);
    end;
  end;
end;


Если меняю 
  Hx := FindWindow(nil, nil);
на
  Hx := FindWindow(nil, 'Amadeus Vista');
то оно его ловит...
однако  в дальнейшем в процедуре
Код

var
  IE : IWebBrowser2;
  Sw: IShellWindows;
  x: Integer;
  iDoc : IHTMLDocument2;
  y: Integer;
  Item: TListItem;
  W : OleVariant; //IHTMLWindow2;
  tmp : OleVariant;
begin
  y :=0;
  ListView2.Clear;
  sw := CoShellWindows.Create;
  if ListView1.Selected <> nil then begin
    for x := SW.Count - 1 downto 0 do
      if (Sw.Item(x) as IWebbrowser2).hwnd = StrToInt(ListView1.Selected.SubItems[0]) then begin
        RichEdit1.Text := variant(Sw.Item(x)).Document.body.innerText;
        (Sw.Item(x) as IWebbrowser2).Document.QueryInterface(IID_IHTMLDocument2,iDoc);
        if iDoc.parentWindow.frames.length > 0 then
          for y := iDoc.parentWindow.frames.length-1 downto 0 do begin
            Item := ListView2.Items.Add;
            Item.SubItems.Add(IntToStr(y));
            tmp := y;
            w := iDoc.parentWindow.frames.item(tmp);
            if w.name <> '' then Item.Caption := w.name
            else Item.Caption := '###' + IntToStr(y);
          end
        else begin
            Item := ListView2.Items.Add;
            Item.SubItems.Add(IntToStr(y));
            Item.Caption := '####';
        end;
        break;
      end;
  end;
end;

текст из окна не выводжится - пусто. хотя он там есть и фрэймов не находит smile

кто-нибудь уже работал с системами бронирвания компании Amadeus? как они маскирую окна терминалов? скачать ява скрипт который открывает такое окно не получается. помогите плиз где грабли? 

Автор: Smailik 11.5.2006, 10:08
нашел вот такой вариант решения - не пашет ни с какими окнами smile где грабли? подскажите плиииииз!!!  smile  
Код

uses
  ActiveX, Shdocvw_tlb, MSHTML_TLB;

type
  TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; wParam: wParam;
    out pObject): HRESULT; 
  stdcall;

function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
  hInst: HWND;
  lRes: Cardinal;
  Msg: Integer;
  pDoc: IHTMLDocument2;
  ObjectFromLresult: TObjectFromLresult;
begin
  hInst := LoadLibrary('Oleacc.dll'); @ObjectFromLresult :=
    GetProcAddress(hInst, 'ObjectFromLresult');
  if @ObjectFromLresult <> nil then 
  begin
    try
      Msg := RegisterWindowMessage('WM_HTML_GETOBJECT');
      SendMessageTimeOut(WHandle, Msg, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
      Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
      if Result = S_OK then
        (pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp,
          IWebbrowser2, IE);
    finally
      FreeLibrary(hInst);
    end;
  end;
end;

 

Автор: Smailik 12.5.2006, 09:41
 smile как выяснилось класс окна -> #32770
такой же класс как и у Rambler-ICQ

 smile SOS! подскажите как из него выдрать интерфейс IE и как вообще узнать если там такой интерфейс? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)