IE插件--如何响应html事件

响应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;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值