在HtmlView中如何屏蔽自动弹出窗口

   Blog开通了挺长时间,但一直想不到写些什么。
   今天上午碰到一个问题,怎么在HtmlView中屏蔽弹出的广告小窗口,用NewWindow2事件不能处理,没有URL参数。查了一下,需要实现DWebBrowserEvents2接口的NewWindow3事件的处理。但在网上搜不到相关的代码, 最后决心自己来写。现在将实现方法贴出来,有兴趣的可以参考一下.

   第一步:  先得实现DWebBrowserEvents2接口,代码如下:

#import "C:/WINDOWS/System32/shdocvw.dll" 
#pragma once

class DWebBrowserEvents2Impl : public DWebBrowserEvents2
{
    // IUnknown methods
    STDMETHOD(QueryInterface)(REFIID riid, LPVOID* ppv);
    STDMETHOD_(ULONG, AddRef)();
    STDMETHOD_(ULONG, Release)();
    // IDispatch methods
    STDMETHOD(GetTypeInfoCount)(UINT* pctinfo);
    STDMETHOD(GetTypeInfo)(UINT iTInfo,
            LCID lcid,
            ITypeInfo** ppTInfo);
    STDMETHOD(GetIDsOfNames)(REFIID riid,
            LPOLESTR* rgszNames,
            UINT cNames,
            LCID lcid,
            DISPID* rgDispId);
    STDMETHOD(Invoke)(DISPID dispIdMember,
            REFIID riid,
            LCID lcid,
            WORD wFlags,
            DISPPARAMS __RPC_FAR *pDispParams,
            VARIANT __RPC_FAR *pVarResult,
            EXCEPINFO __RPC_FAR *pExcepInfo,
            UINT __RPC_FAR *puArgErr);

public:
    DWebBrowserEvents2Impl();
    virtual ~DWebBrowserEvents2Impl();

};

 
第二步: 在HtmlView的OnInitialUpdate中要将 DWebBrowserEvents2Impl m_events (在View类声明)连接到Html的自动化接口。
代码:

    LPDISPATCH pDis = GetApplication( );
    ASSERT(pDis);
    if (pDis)
    {
        LPCONNECTIONPOINTCONTAINER pCPC = NULL;
        LPCONNECTIONPOINT pCP = NULL;
        HRESULT hr = pDis->QueryInterface(IID_IConnectionPointContainer, (LPVOID*)&pCPC);
        ASSERT(SUCCEEDED(hr));
        if (SUCCEEDED(hr))
        {
            hr = pCPC->FindConnectionPoint(__uuidof(SHDocVw::DWebBrowserEvents2Ptr), &pCP);
            ASSERT(SUCCEEDED(hr));
            if ( SUCCEEDED(hr) )
            {
                DWORD dwCookie;
                hr = pCP->Advise((LPUNKNOWN)&m_events, &dwCookie);
                ASSERT(SUCCEEDED(hr));
            }
        }
    }

最后:在DWebBrowserEvents2Impl::Invoke函数里监听NewWindow3 Event:

HRESULT __stdcall DWebBrowserEvents2Impl::Invoke(DISPID dispIdMember,
            REFIID riid,
            LCID lcid,
            WORD wFlags,
            DISPPARAMS __RPC_FAR *pDispParams,
            VARIANT __RPC_FAR *pVarResult,
            EXCEPINFO __RPC_FAR *pExcepInfo,
            UINT __RPC_FAR *puArgErr)
{
    if (dispIdMember == 0x111) //NewWindow3 Event
    {//
        /*void NewWindow3(     
            IDispatch **&ppDisp,
            VARIANT_BOOL *&Cancel,
            DWORD dwFlags,
            BSTR bstrUrlContext,
            BSTR bstrUrl
            );*/
        DWORD dwFlags = (DWORD)pDispParams->rgvarg[2].lVal;
        if (!(dwFlags&0x0002))
        { //stop the advertising
            VARIANT_BOOL * pCancel = (VARIANT_BOOL *)pDispParams->rgvarg[3].pboolVal ;
            * pCancel = TRUE;
        }
    }

    return NOERROR;
}

程序在VC6.0, WindowsXP SP2中调试通过。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值