我需要从每个浏览器窗口评估文档并采取相应措施。我正在使用shellwindows来获取IwebBrowser2。然后我可以访问我需要的所有文档属性。即...
ShellWindows:= TshellWindows.Create(nil);
...
ShellWindowDisp:= ShellWindows.Item(Count); // for loop
...
ShellWindowDisp.QueryInterface(iWebBrowser2,WebBrowser);
等...
据我所知,这种方法很好用。但是,如果其中一个文档发生变化,我的代码就永远不会知道。因此,我需要监视资源管理器以查找OnDocumentComplete等事件。将上面的代码转储到计时器中并且比较属性显然不是可行的方法。我发现了几个捕获事件的组件,但宁愿不依赖于第三方组件。由于我对这方面的了解有限,我需要了解发生了什么。那里有什么好的文章可以解释如何解决这个问题,最好是简单的源代码?
答案 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.