OnBeforeNavigate2 时间当转向新地址之前发生,在此之前用户可以通过各种条件限定来决定是否转向,但这个事件有一个特点就是:如果同一个页面中有 frame,iframe等,会多次激发这个事件,有些特定的场合可能需要判定是否是最上层页面激发的,此时就需要使用该事件的另外一种形式。

1
BeforeNavigate2(LPDISPATCH pDisp, VARIANT* URL,VARIANT* Flags, VARIANT* TargetFrameName,VARIANT* PostData, VARIANT* Headers, BOOL* Cancel)

CHtmlView 中默认的 OnBeforeNavigate2 事件是不带 pDisp 参数的,因此不能直接从 VC 的 ClassWizard 下复写该事件,只能手工添加,在 .h 中照葫芦画瓢

1
virtual void BeforeNavigate2(LPDISPATCH pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, BOOL* Cancel);

在 cpp 中添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void CIEView::BeforeNavigate2(LPDISPATCH pDisp, VARIANT* URL,VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, BOOL* Cancel)
{
CString strURL(URL->bstrVal)
//do sth
HRESULT hr;
IUnknown* pUnkBrowser = NULL;
IUnknown* pUnkDisp=NULL;

hr = m_pBrowserApp->QueryInterface( IID_IUnknown,(void**)&pUnkBrowser);
if ( SUCCEEDED(hr) )
{
hr = pDisp->QueryInterface( IID_IUnknown, (void**)&pUnkDisp );
if ( SUCCEEDED(hr) )
{
if ( pUnkBrowser == pUnkDisp )
{
// 这是顶层框架窗口
//do sth
}
}
}
CHtmlView::BeforeNavigate2(pDisp, URL,Flags, TargetFrameName, PostData, Headers, Cancel);

}

特此记之方便他人,免得走弯路。