您的位置:首页 > 编程语言 > C语言/C++

VC++ webbrowser函数使用范例

2016-02-22 22:30 429 查看
/*============================说明部分=================================

实现一下函数需包含头文件

#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

==============================================================================*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows c++