首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IE自动化:如何确定用户启动的导航发生/已经发生的时间?

IE自动化:如何确定用户启动的导航发生/已经发生的时间?
EN

Stack Overflow用户
提问于 2009-01-18 14:35:57
回答 1查看 1.6K关注 0票数 1

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

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

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

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2009-05-21 11:05:00

您可以测试BeforeNavigate/NavigateComplete/DocumentComplete事件是来自ineere框架还是最上面的简单事件,方法是根据指向浏览器对象的指针测试pDispParams资源,您已经存储在BHO的SetSite方法中。

下面是C++代码,希望您可以轻松地将其转换为C#:

代码语言:javascript
复制
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方法中获得的浏览器对象的指针,

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/455230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档