如何使用Delphi从IE接收事件?

时间:2012-06-10 15:03:01

标签: delphi

我需要从每个浏览器窗口评估文档并采取相应措施。我正在使用shellwindows来获取IwebBrowser2。然后我可以访问我需要的所有文档属性。即...

ShellWindows:= TshellWindows.Create(nil);

...

ShellWindowDisp:= ShellWindows.Item(Count); // for loop

...

ShellWindowDisp.QueryInterface(iWebBrowser2,WebBrowser);

等...

据我所知,这种方法很好用。但是,如果其中一个文档发生变化,我的代码就永远不会知道。因此,我需要监视资源管理器以查找OnDocumentComplete等事件。将上面的代码转储到计时器中并且比较属性显然不是可行的方法。我发现了几个捕获事件的组件,但宁愿不依赖于第三方组件。由于我对这方面的了解有限,我需要了解发生了什么。那里有什么好的文章可以解释如何解决这个问题,最好是简单的源代码?

1 个答案:

答案 0 :(得分:4)

为了访问WebBrowser实例的事件,您必须使用IConnectionPointContainer接口的QueryInterface方法获取指向IWebBrowser2接口的指针,然后调用FindConnectionPoint方法传递GUID的GUID。 DWebBrowserEvents2接口,最后调用IConnectionPoint接口的Advise方法开始接收事件。

像这样的东西

var
 LConnectionPointContainer : IConnectionPointContainer;
 LConnectionPoint : IConnectionPoint;
 dwCookie: Longint;
begin
  //LWebBrowser2 is a IWebBrowser2 object
  LWebBrowser2.QueryInterface(IConnectionPointContainer, LConnectionPointContainer);
  LConnectionPointContainer.FindConnectionPoint(DWebBrowserEvents2, LConnectionPoint);
  LConnectionPoint.Advise(Self, dwCookie);
end;

所有这些代码必须在一个从IDispatch下降的类中实现,以便在Invoke方法中接收事件。在您的情况下,您需要拦截{em> DispID 参数的值为259时必须检查的DocumentComplete事件。

如果您需要此解释的示例,请尝试检查此代码intercept Internet Explorer messages.