1

我有一个 Internet Explorer BHO(在 c# .net 中)并且想要识别用户何时启动导航或用户启动导航何时完成。用户发起我的意思是点击一个链接或类似的动作。特别是如果正在加载的文档中有多个框架,我想将它们视为一个“导航”,但我想不出任何简单的方法来做到这一点。我知道 BeforeNavigate2 和 DocumentComplete 事件,但是看不到任何方法来区分用户单击链接时触发的 BeforeNavigate/DocumentComplete 和由于框架正在加载而触发。

我在想的一种可能的解决方案是,顶部框架的 BeforeNavigate2 总是在内部框架之前被触发(显然),然后子框架的 DocumentComplete 在顶部的 DocumentComplete 之前被调用,它总是最后调用. 因此,例如,我可以在 BeforeNavigates 中增加一个计数器并在 DocumentComplete 中减少它,只有当它为 0 时,它才是用户启动的导航。

但我不确定我是否可以依靠这个,或者是否有更好的方法来做到这一点。例如,如果用户在其中一帧后按下 ESC 但并非所有帧都完成加载会发生什么情况:是否曾调用顶部帧的 DocumentComplete?

有什么建议么?

4

1 回答 1

0

您可以通过针对您存储在 BHO 的SetSite方法中的浏览器对象的指针测试pDispParams参数来测试BeforeNavigate/NavigateComplete/DocumentComplete事件是来自 ineere 框架还是来自最简单的框架。

这是执行此操作的 C++ 代码,我希望您可以轻松地将其转换为 C#:

STDMETHODIMP MyBHO::Invoke(DISPID dispidMember,
  REFIID riid, 
  LCID lcid,
  WORD wFlags,
  DISPPARAMS* pDispParams,
  VARIANT* pvarResult,
  EXCEPINFO* pExcepInfo,
  UINT* puArgErr)
{
  if( dispidMember != DISPID_BEFORENAVIGATE2 &&
      dispidMember != DISPID_NAVIGATECOMPLETE2 &&
      dispidMember != DISPID_DOCUMENTCOMPLETE )
    return S_OK;

  CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> frame =
    pDispParams->rgvarg[ 1 ].pdispVal;

  if( webBrowser2 != frame )
    return S_OK;
}

webBrowser2是指向您在SetSite方法中获得的浏览器对象的指针,

于 2009-05-21T11:05:00.983 回答