VC++ webbrowser函数使用范例

来源:互联网 发布:ping网络延迟忽高忽低 编辑:程序博客网 时间:2024/05/21 11:11
/*============================说明部分=================================  实现一下函数需包含头文件 #include <Wininet.h> #include <Shlwapi.h> Linker : Wininet.lib  Shlwapi.lib =================================================================*/  /*========================================END========================================*/    /*============================说明部分================================= 清除指定网页Cookie,注意传参,如:www.baidu.com 要写为:baidu.com =================================================================*/  BOOL CleanUrlCache(LPCTSTR lpUrl)  {      LPINTERNET_CACHE_ENTRY_INFO lpICEI = NULL;      DWORD dwSize = 0;      HANDLE hFind = FindFirstUrlCacheEntry(NULL, NULL, &dwSize);      if (hFind == NULL && GetLastError() != ERROR_INSUFFICIENT_BUFFER)          return FALSE;        lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];      hFind = FindFirstUrlCacheEntry(NULL, lpICEI, &dwSize);      if (hFind == NULL)      {          delete lpICEI;          return FALSE;      }        do       {          if (StrStrI(lpICEI->lpszSourceUrlName, lpUrl))          {              int bRet = DeleteUrlCacheEntry(lpICEI->lpszSourceUrlName);          }          delete lpICEI;          lpICEI = NULL;          dwSize = 0;            if (!FindNextUrlCacheEntry(hFind, NULL, &dwSize) && GetLastError() != ERROR_INSUFFICIENT_BUFFER)              break;          lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];      } while (FindNextUrlCacheEntry(hFind, lpICEI, &dwSize));        if (lpICEI != NULL)          delete lpICEI;      return TRUE;  }  /*========================================END========================================*/          /*============================说明部分================================= 清除IE所有Cookie #include <Wininet.h> Linker : Wininet.lib =================================================================*/  void   ClearInternetCache()     {         DWORD   dwNeeded   =   0;         FindFirstUrlCacheEntry(NULL,   NULL,   &dwNeeded);          if   (GetLastError()   ==   ERROR_INSUFFICIENT_BUFFER)         {             unsigned   char   *buffer   =   new   unsigned   char[dwNeeded];             try             {                 LPINTERNET_CACHE_ENTRY_INFO   lpicei   =                     reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);                 HANDLE   HFind   =     FindFirstUrlCacheEntry(NULL,   lpicei,   &dwNeeded);                 DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);                  bool   no_more_files   =   false;                 while   (!no_more_files)                 {                     if   (FindNextUrlCacheEntry(HFind,   lpicei,   &dwNeeded))                     {                         DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);                     }                     else   switch   (GetLastError())                     {     case   ERROR_INSUFFICIENT_BUFFER:         {             delete   []   buffer;             buffer   =   new   unsigned   char[dwNeeded];             lpicei   =   reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);             break;         }     default:         {             no_more_files   =   true;             break;         }                     }                 }              FindCloseUrlCache(HFind);          }             catch   (...)             {                 delete   []   buffer;             }             delete   []   buffer;                         }     }    /*========================================END========================================*/    /*============================说明部分================================= CString 转换为 VARIANT 类型 =================================================================*/  StringToVariant(CString str)  {      VARIANT variant;      VariantInit(&variant);      variant.vt=VT_BSTR;      variant.bstrVal=str.AllocSysString();        return variant;  }  /*========================================END========================================*/    /*============================说明部分================================= 打开指定URL,其中m_webBrowser 是web browser 控件关联的控件类型的变量 =================================================================*/  OpenURL(LPCTSTR strURL)  {      VARIANT vInfo;      VariantInit(&vInfo);      CString strHeaders=_T("Content-Type:application/x-WWW-form-urlencoded");      VARIANT vHeaders=StringToVariant(strHeaders);      m_webBrowser.Navigate(strURL,&vInfo,&vInfo,&vInfo,&vHeaders);  }  /*========================================END========================================*/          /*============================说明部分================================= 向指定ID的HTML标记中输入文字 strID为标记的ID值  #include <mshtml.h> #include <atlbase.h> =================================================================*/  InputText(CString strID, CComVariant strText)  {      HRESULT hr;        IDispatch *pDisp;      pDisp=m_webBrowser.get_Document();  //得到webBrowser控件接口         IHTMLDocument2* pDoc;      hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口             IHTMLElementCollection* pColl=NULL;      hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合         IDispatch *pDisp2;      VARIANT index;//用于接收返回元素基于的索引,一般不用,设为0就好,而是用IDispatch 接收元素对象接口       //V_VT(&index)=VT_I4;       //V_I4(&index)=0;       index.vt=VT_I4;      index.lVal=0;        VARIANT varID;//要查找的HTML标记ID       varID=StringToVariant(strID);        hr=pColl->item(varID,index,&pDisp2); //找到元素的位置       if(S_OK==hr&&NULL!=pDisp2)      {          IHTMLElement* pElem=NULL;          hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);            if(S_OK==hr&&NULL!=pElem)          {              pElem->put_innerText(strText.bstrVal);              pElem->Release();          }          pDisp2->Release();          pDisp->Release();      }  }  /*========================================END========================================*/  /*============================说明部分================================= 点击指定ID值的HTML按钮 strID是按钮的ID值 #include <mshtml.h> #include <atlbase.h> =================================================================*/  ClickBtn(CString strID)  {      HRESULT hr;      IDispatch* pDisp;      pDisp=m_webBrowser.get_Document();//①得到网页控件接口         IHTMLDocument2* pDoc;      hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);//②得到网页文档接口         IHTMLElementCollection* pColl=NULL;      hr=pDoc->get_all(&pColl);//③得到网页元素记录集合接口         IDispatch* pDisp2;      VARIANT index;      //V_VT(&index)=VT_I4;       //V_I4(&index)=0;       index.vt=VT_I4;      index.lVal=0;        VARIANT varID;      varID=StringToVariant(strID);        hr=pColl->item(varID,index,&pDisp2);//④得到指定HTML标记接口         if(S_OK==hr&&NULL!=pDisp2)      {          IHTMLElement* pElem=NULL;          hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);//⑤得到确定元素接口             if(S_OK==hr&&NULL!=pElem)          {              pElem->click();              pElem->Release();          }          pDisp2->Release();          pDisp->Release();      }  }  /*========================================END========================================*/  /*=============================================================== 根据页面Class属性值点击页面元素 =================================================================*/  void CPiLiangQianDaoDlg::ClickByClassName()  {      IHTMLElementCollection   *objAllElement=NULL;       IHTMLDocument2   *objDocument=NULL;         objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document();       //由控件得到IHTMLDocument2接口指针         objDocument-> get_all(&objAllElement);   //得到网页所有元素的集合         IHTMLElement   *   pElem   =   NULL;         VARIANT   name;       CComBSTR   tag;       long     a;       objAllElement-> get_length(&a);       name.vt=VT_I4;      for(int   i=0;i <a;i++)//遍历所有元素       {           name.lVal   =   i;           IDispatch   *   pDispatch=NULL;           objAllElement-> item(name,name,&pDispatch);           IHTMLElement*   spElement;           pDispatch-> QueryInterface(IID_IHTMLElement,   (void**)&spElement);           BSTR   tag;           spElement->get_className(&tag);           CString   ss(tag);           if(ss == "j_signbtn sign_btn2 j_cansign sign0" || ss == "j_signbtn sign_btn2 j_cansign sign1" || ss == "j_signbtn sign_btn2 j_cansign sign6")               spElement-> click();       }   /*=====================================================================================*/  /*===================================================================================== 根据网页打开的进程设置进度条 给web browser添加OnProgressChange响应函数 m_procCtrl是进度条关联的控件变量 =======================================================================*/  if(ProgressMax>0)      m_procCtrl.SetPos(100*Progress / ProgressMax);  //========================================     /*==================================================================== 搜索点击页面文字连接 Str为文字 =======================================================================*/  ClickItem(CString str)  {      IHTMLElementCollection   *objAllElement=NULL;       IHTMLDocument2   *objDocument=NULL;                objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document();      //由控件得到IHTMLDocument2接口指针         objDocument-> get_all(&objAllElement);   //得到网页所有元素的集合         IHTMLElement   *   pElem   =   NULL;         VARIANT   name;       CComBSTR   tag;       long     a;       objAllElement-> get_length(&a);       name.vt=VT_I4;      for(int   i=0;i <a;i++)//遍历所有元素       {           name.lVal   =   i;           IDispatch   *   pDispatch=NULL;           objAllElement-> item(name,name,&pDispatch);           IHTMLElement*   spElement;           pDispatch-> QueryInterface(IID_IHTMLElement,   (void**)&spElement);           BSTR   tag;           spElement-> get_outerText(&tag);           CString   ss(tag);           if(ss=="地图")               spElement-> click();       }   }  /*=====================================================================================*/  /*======================================================================================= 在DocumentCompleteExplorer判断是否为主框架加载完毕 在页面中有多个框架时会多次触发,可能导致页面中后面的“首页”链接得不到,可以在void   CTest2Dlg::OnDownloadCompleteExplorer1(LPDISPATCH   pDisp,   VARIANT   FAR*   URL)  加入下面代码:  ======================================================================================*/CComQIPtr <IWebBrowser2,   &IID_IWebBrowser2>   pWeb; CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2>   pDoc2; pWeb   =   pDisp; pWeb-> get_Document((IDispatch**)&pDoc2); if   (m_ie.GetDocument()   !=   pDoc2)   return;  /*==========================================================================*/      /*======================================================================    判断网页是否加载完毕 ========================================================================*/  void CPiLiangQianDaoDlg::DocumentCompleteExplorer(LPDISPATCH pDisp, VARIANT* URL)  {      // TODO: 在此处添加消息处理程序代码       if(m_webBrowser.get_ReadyState() == READYSTATE_COMPLETE && times == 0)       {       ((CListBox *)GetDlgItem(IDC_LIST_STATE))->AddString(_T("加载完毕!"));       m_IsInitDone = 1;       times++;      }  }     /*======================================================================================  截取网页部分内容,并画图显示 ======================================================================================*/  {  CClientDC hImageDC(GetDlgItem(IDC_EDIT_INFO));        HRESULT hr;        IDispatch *pDisp;      pDisp=m_webBrowser.get_Document();  //得到webBrowser控件接口         IHTMLDocument2* pDoc;      hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口             IHTMLElementCollection* pColl=NULL;      hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合         IDispatch *pDisp2;      VARIANT index;//用于接收返回元素基于的索引,一般不用,设为就好,而是用IDispatch 接收元素对象接口       //V_VT(&index)=VT_I4;       //V_I4(&index)=0;       index.vt=VT_I4;      index.lVal=0;        VARIANT varID;//要查找的HTML标记ID       varID=StringToVariant(_T("userlike_info_head_img"));        hr=pColl->item(varID,index,&pDisp2); //找到元素的位置       if(S_OK==hr&&NULL!=pDisp2)      {          IHTMLElement3* pElem=NULL;          hr=pDisp2->QueryInterface(IID_IHTMLElement3,(void**)&pElem);          IHTMLElementRender *pRender =  NULL;            pElem ->QueryInterface(IID_IHTMLElementRender, (void **) &pRender);            pRender->DrawToDC(hImageDC);      }  }  /*=================================================================================*/    /*================================================================================= 判断网页是否加在完全(包含框架) 原理:如果直接早DocummentComple里判断的话,包含多个框架(frame)的网页就会多次激发该函数。所以这里我们这里通过pDish判断是不是主框架的的借口(最后调用该函数),如果是的话就是最后一次激发,表示主框架家在完毕,也就是整个网页加载完毕! =====================================================================================*/  void CTieBaGuajiDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)  {      // TODO: 在此处添加消息处理程序代码       CComQIPtr <IWebBrowser2,   &IID_IWebBrowser2>   pWeb;       CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2>   pDoc2;       pWeb   =   pDisp;       pWeb-> get_Document((IDispatch**)&pDoc2);       if   (m_webBrowser.get_Document()   ==   pDoc2)         {            ((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!"));      }      /////////////////////////////////////////       /*if(0==m_count)     {         ((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!"));         m_count++;     }*/  }  /*=============================================================================*/  /*==============================================================================  另外如果不想让webbrowser空间弹出错误提示可以,在对空间资源编辑时设置Slient为TRUE ==============================================================================*/  


1 0
原创粉丝点击