在点击网页中的一个链接时,会多次调用控件的BeforeNavigate2消息处理函数,我们怎么样才能在其中获取到我们所点击的链接地址呢。
如果是基于web browser控件的开发,可以按如下方法实现:
void CIEDialog::On
{
HRESULT hr;
LPUNKNOWN lpUnknown;
LPUNKNOWN lpUnknownWB = NULL;
LPUNKNOWN lpUnknownDC = NULL;
lpUnknown = m_cWebBrowser.GetControlUnknown();
ASSERT(lpUnknown);
hr = lpUnknown->QueryInterface( IID_IUnknown, (LPVOID*)&lpUnknownWB );
ASSERT(SUCCEEDED(hr));
if (FAILED(hr))
return;
hr = pDisp->QueryInterface(IID_IUnknown, (LPVOID*)&lpUnknownDC );
ASSERT(SUCCEEDED(hr));
if ( SUCCEEDED(hr) && lpUnknownWB == lpUnknownDC )
{
TCHAR szUrl[MAX_PATH];
_tcscpy( szUrl, (TCHAR*)(_bstr_t)URL );
AfxMessageBox( "此时即时你所点击的链接点下的URL" );
AfxMessageBox( szUrl );
}
}
若是基于CHtmlView的工程,如下可实现:
void CXXHtmlView::BeforeNavigate2(LPDISPATCH pDisp , VARIANT* URL,
VARIANT* Flags, VARIANT* TargetFrameName,
VARIANT* PostData, VARIANT* Headers, BOOL* Cancel)
{
IOleWindow *pOWin=NULL;
HWND hBWnd = NULL;
HRESULT hRes = m_pBrowserApp->QueryInterface(IID_IOleWindow, (void **)&pOWin);
if (SUCCEEDED(hRes))
{
hRes = pOWin->GetWindow(&hBWnd);
if (SUCCEEDED(hRes))
{
CWnd *pWnd = CWnd::FromHandle( hBWnd );
if( pWnd )
{
LPUNKNOWN lpUnknown;
LPUNKNOWN lpUnknownWB = NULL;
LPUNKNOWN lpUnknownDC = NULL;
lpUnknown = pWnd->GetControlUnknown();
ASSERT(lpUnknown);
if (lpUnknown)
{
hRes = lpUnknown->QueryInterface( IID_IUnknown, (LPVOID*)&lpUnknownWB );
ASSERT(SUCCEEDED(hRes));
if (FAILED(hRes))
return;
hRes = pDisp->QueryInterface(IID_IUnknown, (LPVOID*)&lpUnknownDC );
ASSERT(SUCCEEDED(hRes));
if ( SUCCEEDED(hRes) && lpUnknownWB == lpUnknownDC )
{
TCHAR szUrl[MAX_PATH];
_tcscpy( szUrl, (TCHAR*)(_bstr_t)URL );
AfxMessageBox( "此时即时你所点击的链接点下的URL" );
AfxMessageBox( szUrl );
}
}
}
}
}
}
若有问题,请批评指正,谢谢