对于delphi自带的TWebBrowser控件,可容易地得到IHTMLdocument2接口(代码如下)但若只知道某IE窗口的句柄,如何由此得到该窗口的IHTMLdocument2接口?Thanks in advance.///////////////////////////////////////////////////////////////////////
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw, StdCtrls, ActiveX, MSHtml;type
  TForm1 = class(TForm)
    Button1: TButton;
    WebBrowser1: TWebBrowser;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  doc:IHTMLdocument2;
  elem:IHTMLElement;
begin
  try
    doc:=WebBrowser1.document as IHTMLdocument2;
    if doc = nil then
    begin
      self.Caption := 'NULL';
    end
    else
    begin
      elem:=doc.all.item('mybuttonid',0) as IHTMLElement;
      elem.click;
    end
  except
  end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
    WebBrowser1.Navigate('c:\temp\html.html');
end;end.

解决方案 »

  1.   

    使用GetIEFromHWND,然后:IEWnd.Document as IHTMLDocument2得到IHTMLDocument2接口p.s. IE的类名是IEFrame,在IEFrame里面查找类名为“Shell DocObject View”的句柄,然后再在该句柄中继续查找“Internet Explorer_Server”才可以得到IE的那个浏览控件的句柄。然后才能使用GetIEFromHWNDfunction GetIEFromHWND(hWnd: HWND; var IE: IWebbrowser2): HRESULT;
    type
        TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; WPARAM: wParam; out pObject): HRESULT; stdcall;
    var
    hInst: THandle;
    lRes: Cardinal;
    MSG: Integer;
    pDoc: IHTMLDocument2;
    ObjectFromLresult: TObjectFromLresult;
    begin
        result:=S_OK;
        if (hWnd<=0) then
            exit;
    hInst := LoadLibrary('Oleacc.dll');
        if (hInst>0) then
        try
            @ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');
            MSG := RegisterWindowMessage('WM_HTML_GETOBJECT');
            SendMessageTimeOut(hWnd, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
            Result := ObjectFromLresult(lRes, IID_IHTMLDocument2, 0, pDoc);
            if Result = S_OK then
            begin
                (pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2,    IE);
            end;
        finally
            FreeLibrary(hInst);
        end;
    end;