ShellWindow := CreateComObject(CLASS_ShellWindows) as IShellWindows;
nCount := ShellWindow.Count;
for i := 0 to nCount - 1 do
begin
  vi := i;
  Try
    spDisp := ShellWindow.Item(vi);
  Except End;
  if (spDisp <> nil) then
  begin
    Try
      spDisp.QueryInterface(iWebBrowser2, IE1);
    Except End;
    if (IE1 <> nil) and (pos('百度一下',PChar(IE1.LocationName)) <> 0) then 
    begin
      Sleep(5000);
      IE1.Quit;
    end; 
  end;
end;
当延时5000毫秒这段时间内 点击图片或者文字链接弹出另外一个窗口
用IE1.Quit只能控制父窗口的退出 并不能控制弹出的子窗口退出
请问有什么方法或者属性可以控制子窗口的IE事件?

解决方案 »

  1.   

    给你一些参考代码
    uses SHDocVw, MSHTML, ActiveX;
    procedure ExtractDocumentLinks(pHTMLDocument: IHTMLDocument2; pStrings: TStringList);
    var
      pAnchors: IHTMLElementCollection;
      ilHrefCount, ilHrefIndex: integer;
      vIndex: OleVariant;
      pItem: IDispatch;
      pAnchor: IHTMLAnchorElement;
      bURL: string;
    begin
      if (pHTMLDocument <> nil) then
      begin
        pAnchors := pHTMLDocument.get_all;
        ilHrefCount := pAnchors.get_length;
        if ilHrefCount = 0 then exit;
        for ilHrefIndex := 0 to ilHrefCount - 1 do
        begin
          TVariantArg(vIndex).vt := VT_I4;
          TVariantArg(vIndex).lVal := ilHrefIndex;
          pItem := pAnchors.item(vIndex, vIndex);
          if(pItem <> nil) then
          begin
            if(SUCCEEDED(pItem.QueryInterface(IID_IHTMLAnchorElement, pAnchor))) then
            begin
              bURL := pAnchor.get_href;
              if (pStrings.IndexOf(AnsiString(WideString(bURL))) < 0) and
                (length(bURL) > 0) then
                pStrings.Add(bURL);
            end;
            pItem := nil;
          end;
        end;
        pAnchors := nil;
      end;
    end;procedure TfrmMain.ExtractLinks(WebBrowser: IWebBrowser2; pStrings: TStringList);
    var
      vFrame, ret: OleVariant;
      ilFrameIndex, ilFramesCount: integer;
      pDoc, HTMLDocument: IHTMLDocument2;
      pWindow: IHTMLWindow2;
      pFrames: IHTMLFramesCollection2;
      spdisp:idispatch;
       HtmlInputEle,HtmlInputEle_hy2k: IHTMLInputElement;
       HtmlSelEle : IHTMLSelectElement;
      HtmlTextEle: IHTMLTextElement;
      HtmlTextAreaEle :IHTMLTextAreaElement;
      HtmlLabelEle :IHTMLLabelElement;
      qymc :string;
      pos1,pos2:integer;
      aa :IHTMLEventObj;
      dispparamsNoArgs: DISPPARAMS;
    begin
      if(SUCCEEDED(WebBrowser.Document.QueryInterface(
        IID_IHTMLDocument2, HTMLDocument))) then
      begin
        pFrames:=(HTMLDocument.get_frames as IHTMLFramesCollection2);
        ilFramesCount := pFrames.get_length;
        if ilFramesCount < 2 then
        begin
        // ExtractDocumentLinks(pDoc, pStrings);
        //  HtmlInputEle:=(HTMLDocument.all.item('txtfddbr',0) as IHTMLInputElement);
         //       if HtmlInputEle <> nil then
         //           HtmlInputEle.value :='3';
        end
        else
        begin
          //取网页所有内容
          {for ilFrameIndex := 0 to ilFramesCount - 1 do
          begin
            vFrame := ilFrameIndex;
            spDisp := pFrames.item(vFrame);
            if SUCCEEDED(spDisp.QueryInterface(IHTMLWindow2 ,pWindow))then
              pStrings.Add(pWindow.document.body.innerHTML);
          end; }
          TVariantArg(vFrame).vt := VT_UINT;
          for ilFrameIndex := 1 to ilFramesCount - 1 do
          begin
            TVariantArg(vFrame).lVal := ilFrameIndex;
            spDisp := pFrames.item(vFrame);
            if (SUCCEEDED(spDisp.QueryInterface(IID_IHTMLWindow2, pWindow))) then
            begin
              pDoc := pWindow.get_document;
              if pDoc.title = 'XXXX' then
              begin
                 HtmlInputEle:=(pDoc.all.item('test11',0) as IHTMLInputElement);
                 if HtmlInputEle <> nil then
                 begin
                   HtmlInputEle.select;
                   HtmlInputEle.value :='111';
                   vi2 := HtmlInputEle.get_onchange;  // 事件
                   ev := IDispatch(vi2);
                   dispparamsNoArgs.rgvarg := nil;
                   dispparamsNoArgs.rgdispidNamedArgs := nil;
                   dispparamsNoArgs.cArgs := 0;
                   dispparamsNoArgs.cNamedArgs := 0;
                   ev.Invoke(
                      DISPID_VALUE,
                      GUID_NULL,
                      LOCALE_USER_DEFAULT,
                      DISPATCH_METHOD,
                      dispparamsNoArgs,
                      @vr,
                      nil,
                    nil);
                 end;
              end;    
              pDoc := nil;
              pWindow := nil;
            end;
          end;
        end;
      end;
    end;
      

  2.   

    用IE1.Quit只能控制父窗口的退出 并不能控制弹出的子窗口退出新弹出的,在你开始遍历的时候, CreateComObject(CLASS_ShellWindows) as IShellWindows;
    是没有的
    要想控制它, 只能再次遍历或者 找找通过开始找到的接口,看是否可以挂接事件