高手请进:已知IE窗口的句柄,如何由此得到IHTMLdocument2接口?

nothing 2003-09-29 04:04:08
对于delphi自带的TWebBrowser控件,可容易地得到IHTMLdocument2接口(代码如下)

但若只知道某IE窗口的句柄,如何由此得到该窗口的IHTMLdocument2接口?

Thanks in advance.

///////////////////////////////////////////////////////////////////////
unit Unit1;

interface

uses
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.
...全文
95 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
nothing 2003-09-29
  • 打赏
  • 举报
回复
搞定了

非常感谢 Eastunfail
Eastunfail 2003-09-29
  • 打赏
  • 举报
回复
使用GetIEFromHWND,然后:IEWnd.Document as IHTMLDocument2得到IHTMLDocument2接口

p.s. IE的类名是IEFrame,在IEFrame里面查找类名为“Shell DocObject View”的句柄,然后再在该句柄中继续查找“Internet Explorer_Server”才可以得到IE的那个浏览控件的句柄。然后才能使用GetIEFromHWND



function 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;

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧