我有一个Internet BHO (在c# .net中),它希望识别用户何时启动导航,或者用户启动的导航何时完成。用户启动的意思是点击链接或类似的操作。特别是,如果要加载文档中的多个框架,我希望将它们作为一个“导航”来处理,但我想不出任何简单的方法来做到这一点。我知道BeforeNavigate2和DocumentComplete事件,但在用户单击链接时看不到区分BeforeNavigate/DocumentComplete触发的任何方法,但由于帧正在加载而触发。
我认为一个可能的解决方案是,顶部框架的BeforeNavigate2总是在内部框架之前被触发(很明显),然后子框架的DocumentComplete在顶部的DocumentComplete之前被调用,后者总是被称为最后一个。例如,我可以在BeforeNavigates中增加计数器,在DocumentComplete中减少计数器,只有当计数器为0时,它才是用户启动的导航。
但我不确定我是否能依靠这个,或者是否有更好的方法去做。例如,如果用户在其中一个帧之后按ESC,但并非所有帧都已完成加载,会发生什么情况:是否调用了顶部帧的DocumentComplete?
有什么建议吗?
发布于 2009-05-21 11:05:00
您可以测试BeforeNavigate/NavigateComplete/DocumentComplete事件是来自ineere框架还是最上面的简单事件,方法是根据指向浏览器对象的指针测试pDispParams资源,您已经存储在BHO的SetSite方法中。
下面是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方法中获得的浏览器对象的指针,
https://stackoverflow.com/questions/455230
复制相似问题