Home » Tipps & Tricks » Netzwerk/Internet » Browser » URLs aus allen IE-Fenstern ermitteln

URLs aus allen IE-Fenstern ermitteln

Folgender Code ermittelt in der Funktion GetIEWindows zunächst alle geöffneten Internet Explorer-Fenster und dann den URL der darin angezeigten Webseite.Damit der Code funktioniert, müssen die beiden Units Shdocvw_tlb.pas und MSHTML_TLB.pas angelegt werden. Dazu in Delphi über das Menü Komponenten/ActiveX importieren erst ‚Microsoft HTML Object Library‘ auswählen und auf ‚Unit anlegen‘ klicken. Das gleiche mit „Microsoft Internet Control“ wiederholen.

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;

procedure GetIEWindows(lb: TListBox);
  function EnumWindowsProc (Wnd: HWND; lb: TListBox): BOOL; stdcall;
  var
    theClassname: array [0..128] of Char;
    caption: Array [0..128] of Char;
    IE: IWebbrowser2;
    WndChild: HWND;
  begin
    Result := True;
    Windows.GetClassname( Wnd, theClassname, Sizeof( theclassname ));
    if theClassname='IEFrame' then
    begin
      WndChild := FindWindowEX(Wnd, 0, 'Shell DocObject View', nil);
      if WndChild  0 then
      begin
        WndChild := FindWindowEX(WndChild, 0, 'Internet Explorer_Server', nil);
        if WndChild  0 then
        begin
          if GetIEFromHWND(WndChild, IE)=S_OK then
            if IEnil then
              lb.Items.Add(IE.LocationURL);
        end;
      end;
    end;
  end;
begin
  lb.Clear;
  EnumWindows(@EnumWindowsProc, integer(lb));
end;

Beispiel-Aufruf, der die URLs in einer ListBox mit Namen ListBox1 ausgibt:

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetIEWindows(ListBox1);
end;