3

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

ShellWindows := TshellWindows.Create(nil);

...

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

...

ShellWindowDisp.QueryInterface(iWebBrowser2, WebBrowser);

ETC....

据我所知,这种方法效果很好。但是,如果其中一个文档发生更改,我的代码将永远不会知道。所以我需要监视资源管理器中的事件,例如 OnDocumentComplete。将上面的代码转储到计时器中并比较属性显然不是要走的路。我发现了几个捕获事件的组件,但不想为此依赖第三方组件。由于我在这方面的知识有限,我需要了解发生了什么。那里有任何好的文章来解释如何解决这个问题,最好是使用简单的源代码?

4

1 回答 1

4

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

像这样的东西

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 方法中接收事件。在您的情况下,您需要拦截DocumentComplete事件,您必须在DispID参数的值为 259 时进行检查。

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

于 2012-06-10T17:35:33.710 回答