使用BHO技术在函数中实现获取弹出窗口的URL地址,以下是该函数的源码
STDMETHODIMP CEyeAtIE::Invoke(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags,
                     DISPPARAMS * pDispParams, VARIANT * pvarResult,
                     EXCEPINFO * pexcepinfo, unsigned int FAR * puArgErr)
{
USES_CONVERSION;
if ( !pDispParams )
return E_INVALIDARG; switch( dispidMember )
{
// The parameters for this DISPID are as follows:
// [0]: Cancel flag  -               VT_BYREF|VT_BOOL
// [1]: HTTP headers -               VT_BYREF|VT_VARIANT
// [2]: Address of HTTP POST data  - VT_BYREF|VT_VARIANT 
// [3]: Target frame name -          VT_BYREF|VT_VARIANT 
// [4]: Option flags -               VT_BYREF|VT_VARIANT
// [5]: URL to navigate to -         VT_BYREF|VT_VARIANT
// [6]: An object that evaluates to the top-level or frame
//      WebBrowser object corresponding to the event. 
case DISPID_BEFORENAVIGATE2:
{
LPOLESTR lpURL = NULL;
mWebBrowser2->get_LocationURL(&lpURL); char * strurl = NULL;
/*if ( pDispParams->cArgs >= 5 && pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT) )
{
CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);
varURL.ChangeType(VT_BSTR);
strurl = OLE2A(varURL.bstrVal);
    if ( !strstr(strurl, "about:blank") )
       ::MessageBoxA( NULL, strurl, "提示", MB_OK );
}*/
if ( pDispParams->cArgs >= 6 && pDispParams->rgvarg[6].vt == VT_DISPATCH )
{
CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> pDisp = pDispParams->rgvarg[6].pdispVal;
if ( mWebBrowser2 == pDisp )
{
    CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);
    varURL.ChangeType(VT_BSTR);
    strurl = OLE2A(varURL.bstrVal);         //if ( !strstr(strurl, "about:blank") )  // 这里可以找出用户访问的URL
        //   ::MessageBoxA( NULL, strurl, "提示", MB_OK ); // 用户访问的URL
}
}
// 禁用该网页
//*pDispParams->rgvarg[0].pboolVal = TRUE;
}
break;
case DISPID_NAVIGATECOMPLETE2:
break;
case DISPID_DOCUMENTCOMPLETE:
break;
case DISPID_DOWNLOADBEGIN:
break;
case DISPID_DOWNLOADCOMPLETE:
break;
case DISPID_NEWWINDOW2:
// 设置是否允许弹出窗口,我想在这里获取弹出窗口的URL地址,请问该怎么得到
//READYSTATE m_ReadyState;
//mWebBrowser2->get_ReadyState( &m_ReadyState ); if ( GetTickCount() - m_EyeAtIE.m_dktime > 500 )

if ( m_EyeAtIE.m_bHoldUp && m_EyeAtIE.m_ToolhWnd != NULL )
{
    *pDispParams->rgvarg[0].pboolVal = TRUE;
SendMessage( m_EyeAtIE.m_ToolhWnd, WM_IE_HOLD_EVENT, 0, 0 );
}
}
/*
if ( m_ReadyState != READYSTATE_COMPLETE )
{
*pDispParams->rgvarg[0].pboolVal = TRUE;
}else
{
*pDispParams->rgvarg[0].pboolVal = FALSE;
}*/
break;
case DISPID_QUIT:
RegisterEventHandler(FALSE);
break;
default:
break;
}
return S_OK;
}请问高手们在DISPID_NEWWINDOW2时该怎么取得弹出窗口的URL

解决方案 »

  1.   

    你应该处理DISPID_NEWWINDOW3,它的参数有5个,第2个参数就是目标URL
      

  2.   

    jameshooo 
    ///////////////
    DISPID_NEWWINDOW3有没有参数能关闭该弹出窗口
    我的要求是不让弹出窗口显示,同时要取得该弹出窗口的URL
      

  3.   

    第4个参数就是,设置成VARIANT_TRUE表示取消
      

  4.   

    多谢jameshooo问题已经得到解决, //0 : bstrUrl         弹出窗口的URL
     //1 : bstrContext     所在网页的URL 
     //2 : dwFlags  
     //3 : *bCancel   是否允许打开该窗口
     //4 : **pDisp
    谢谢你的指点,本人不甚感激