知道句柄怎么获取IWebBrowser2,⊙﹏⊙

解决方案 »

  1.   

    方法一:uses MSHTML, shDocvw,ActiveX;
    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;如果你加分,我将再贴出方法二,不需要引用'Oleacc.dll'
      

  2.   

    结贴给我分吧。我的代码你不会用吗?其实方法一虽然加载了一个DLL,但用着一直很稳定。用法:
    procedure TForm1.Button1Click(Sender: TObject);
    var
     web:IWebbrowser2;
    begin
      GetIEFromHWND('Internet Explorer_Server'的句柄,web);  if web=nil then exit; //新打开的网页被关了或网页未打开!
      try
        label1.Caption:=web.LocationName;
        label2.Caption:=web.LocationURL;
       except
      end;end;