响应html事件有两种实现方式.
1:一种是单独响应某个特定事件
在setsite中添加如下代码:
STDMETHODIMP CCShowWeb::SetSite(IUnknown *pUnkSite)
{
if (NULL != pUnkSite)
{
HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void**)&m_spWebBrowser);
if (NULL != m_spWebBrowser)
{
hr = DispEventAdvise(m_spWebBrowser);
}
}
else
{
DispEventUnadvise(m_spWebBrowser);
}
return IObjectWithSiteImpl<CCShowWeb>::SetSite(pUnkSite);
}
。h中添加如下代码:
#include <exdispid.h>
#include <ExDisp.h>
public IDispEventImpl<1, CCShowWeb, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 0, 1>
public:
BEGIN_SINK_MAP(CCShowWeb)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
END_SINK_MAP()
void STDMETHODVCALLTYPE OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL);:
2.通过连接点响应多种事件
创建连接点:
HRESULT CCShowWeb::AdviseBrowser()
{
HRESULT hr = S_FALSE;
if (NULL == m_spWebBrowser)
{
return hr;
}
CComPtr<IConnectionPointContainer> spSPC;
hr = m_spWebBrowser->QueryInterface(IID_IConnectionPointContainer, (void**)&spSPC);
if (SUCCEEDED(hr))
{
hr = spSPC->FindConnectionPoint(DIID_DWebBrowserEvents2, &m_spConnectPoint);
if (SUCCEEDED(hr))
{
m_spEventSink = new CBrowserEventSink(this);
hr = m_spConnectPoint->Advise(m_spEventSink, &m_dCookie);
if (SUCCEEDED(hr))
{
}
}
}
return hr;
}
在setsite调用:
STDMETHODIMP CCShowWeb::SetSite(IUnknown *pUnkSite)
{
if (NULL != pUnkSite)
{
HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void**)&m_spWebBrowser);
if (NULL != m_spWebBrowser)
{
// hr = DispEventAdvise(m_spWebBrowser);
AdviseBrowser();
}
}
else
{
//DispEventUnadvise(m_spWebBrowser);
}
return IObjectWithSiteImpl<CCShowWeb>::SetSite(pUnkSite);
}
连接点响应事件类定义如下:
class CCShowWeb;
class CContainerWnd;
class CBrowserEventSink:public DWebBrowserEvents2
{
public:
CBrowserEventSink(CCShowWeb* pShowWeb = NULL, CContainerWnd* pContainerWnd = NULL);
~CBrowserEventSink();
public:
// No constructor or destructor is needed
// IUnknown methods
STDMETHODIMP QueryInterface(REFIID riid,void **ppvObject);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// IDispatch methods
STDMETHODIMP GetTypeInfoCount(UINT *pctinfo);
STDMETHODIMP GetTypeInfo(UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
STDMETHODIMP GetIDsOfNames(REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
STDMETHODIMP Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
// DWebBrowserEvents2 does not have any methods, IE calls our Invoke() method to notify us of events
private:
CCShowWeb* m_pShowWeb;
};
这样在Invoke中就可以对各种事件进行捕获。
// This is called by IE to notify us of events
// Full documentation about all the events supported by DWebBrowserEvents2 can be found at
// http://msdn.microsoft.com/en-us/library/aa768283(VS.85).aspx
STDMETHODIMP CBrowserEventSink::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS *pDispParams, VARIANT *pVarResult,
EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
UNREFERENCED_PARAMETER(lcid);
UNREFERENCED_PARAMETER(wFlags);
UNREFERENCED_PARAMETER(pVarResult);
UNREFERENCED_PARAMETER(pExcepInfo);
UNREFERENCED_PARAMETER(puArgErr);
if(!IsEqualIID(riid,IID_NULL))
return DISP_E_UNKNOWNINTERFACE; // riid should always be IID_NULL
if(DISPID_DOCUMENTCOMPLETE == dispIdMember)
{
// ATLTRACE("******* DISPID_DOCUMENTCOMPLETE\n");
if(m_pShowWeb != NULL)
{
m_pShowWeb->DocumentComplete(pDispParams->rgvarg[1].pdispVal, pDispParams->rgvarg[0].pvarVal);
}
}
else if(DISPID_NAVIGATECOMPLETE2 == dispIdMember)
{
}
else if(DISPID_THIRDPARTYURLBLOCKED == dispIdMember)
{
ATLTRACE("******* DISPID_THIRDPARTYURLBLOCKED\n");
}
else if(DISPID_WINDOWACTIVATE == dispIdMember)
{
//ATLTRACE("******* DISPID_WINDOWACTIVATE\n");
}
else if(DISPID_ONVISIBLE == dispIdMember)
{
}
else if(DISPID_ONTOOLBAR == dispIdMember)
{
}
else if(DISPID_BEFORENAVIGATE == dispIdMember)
{
ATLTRACE("DISPID_BEFORENAVIGATE\n");
}
else if(DISPID_BEFORENAVIGATE2 == dispIdMember)
{
}
else if(DISPID_COMMANDSTATECHANGE == dispIdMember)
{
// ATLTRACE("***DISPID_COMMANDSTATECHANGE \n");
}
else if(DISPID_WINDOWACTIVATE == dispIdMember)
{
// ATLTRACE("***DISPID_WINDOWACTIVATE \n");
}
else if(DISPID_WINDOWSTATECHANGED == dispIdMember)
{
DWORD flags = pDispParams->rgvarg[1].intVal;
DWORD valid = pDispParams->rgvarg[0].intVal;
}
else if(DISPID_STATUSTEXTCHANGE == dispIdMember)
{
if(m_pShowWeb != NULL)
{
m_pShowWeb->StatusTextChange(pDispParams->rgvarg[0].bstrVal);
}
}
else if(DISPID_TITLECHANGE == dispIdMember)
{
if(m_pShowWeb != NULL)
{
m_pShowWeb->TitleChange(pDispParams->rgvarg[0].bstrVal);
}
}
else if(DISPID_FILEDOWNLOAD == dispIdMember)
{
}
else if(DISPID_NEWWINDOW3 == dispIdMember) //only in Windows XP Service Pack 2 (SP2) or later
{
if(pDispParams->rgvarg[0].vt == VT_BSTR && pDispParams->rgvarg[1].vt == VT_BSTR && m_pPageCall != NULL)
{
}
}
else if(DISPID_NEWWINDOW2 == dispIdMember)
{
}
else if(DISPID_DOWNLOADBEGIN == dispIdMember)
{
}
else if(DISPID_DOWNLOADCOMPLETE == dispIdMember)
{
}
else if(DISPID_NEWWINDOW == dispIdMember)
{
}
else if(dispIdMember == DISPID_STATUSTEXTCHANGE)
{
}
else if(dispIdMember == DISPID_QUIT)
{
// ATLTRACE("DISPID_QUIT\n");
}
else if(dispIdMember == DISPID_ONQUIT)
{
// ATLTRACE("DISPID_ONQUIT\n");
}
else if(dispIdMember == DISPID_PROGRESSCHANGE)
{
// ATLTRACE("------ DISPID_PROGRESSCHANGE (%d, %d)\n", pDispParams->rgvarg[1].lVal, pDispParams->rgvarg[0].lVal);
if(m_pShowWeb != NULL &&
pDispParams->rgvarg[1].vt == VT_I4 &&
pDispParams->rgvarg[1].lVal == -1)
{
m_pShowWeb->FrameRefreshed();
}
}
else if(DISPID_NAVIGATEERROR == dispIdMember)
{
ATLTRACE("DISPID_NAVIGATEERROR\n");
m_pShowWeb->NavigateError(pDispParams->rgvarg[4].pdispVal, pDispParams->rgvarg[3].pvarVal, pDispParams->rgvarg[2].pvarVal, pDispParams->rgvarg[1].pvarVal, pDispParams->rgvarg[0].pboolVal);
}
}
return S_OK;
}