Rupert

::Me(C#,VC,MonoTouch,MonoforAndroid);

导航

c++ 有关webBrowser控件的一些整理

Posted on 2012-12-08 11:13  ArRan  阅读(1118)  评论(0编辑  收藏  举报

首先,大部分操作都需要用到头文件

 

#include <MsHTML.h>

这个头文件在c#中也有对应的命名空间。应该是.net成员之一。也是……webBrowser就是一个com控件,开发为basic和c#准备的。在c++使用非常繁琐。几个困扰点:空指针:很多情况下的可能性是页面没有完全加载,通过readystate判断下需要获得IHTMLDocument3指针:之所以使用3而不使用网络上流传广泛的2.主要是因为对于控件操作比较方便。2当然也行……我觉得挺麻烦的。

CComPtr<IDispatch> m_pDisp = (IDispatch *)m_ceHtml.get_Document();

CComPtr<IHTMLDocument3> m_pDoc;

m_pDisp->QueryInterface(IID_IHTMLDocument3,(void **)&m_pDoc);

填写网页中某个ID的控件的内容。

IHTMLElement *m_pElementMail=NULL;

HRESULT hr = m_pDoc->getElementById(CComBSTR(_T("ctl00_PlaceHolderPage_email")),&m_pElementMail);

if(hr!=NULL)

{

MessageBox(_T("GetElement of null"));

}

CComBSTR m_bStr = _T("value");

CComVariant m_var =_T("hello@126.com");

m_pElementMail->setAttribute(m_bStr,m_var);

获得某个ID的控件的数据

 

IHTMLElement *m_pCheckImg =NULL;

hr = m_pDoc->getElementById(CComBSTR(_T("mcImgVC")),&m_pCheckImg);

if(hr!=NULL)

{

MessageBox(_T("GetElement of null"));

}

m_bStr = _T("src");

m_pCheckImg->getAttribute(m_bStr,0,&m_var);

对于验证码:

嘛,现在验证码很多都是点击切换,访问切换,所以在获取上只能说通过读取内存或者查找缓存。

使用webBrowser控件,有一种相对简单的方法,利用Render的DrawToDC功能绘制在Picture Control中。

 

IHTMLElement *m_pCheckImg =NULL;

hr = m_pDoc->getElementById(CComBSTR(_T("mcImgVC")),&m_pCheckImg);

if(hr!=NULL)

{

MessageBox(_T("GetElement of null"));

}

m_bStr = _T("src");

m_pCheckImg->getAttribute(m_bStr,0,&m_var);

m_strCheckCode = m_var;

UpdateData(FALSE);

IHTMLElementRender *m_pRender =NULL;

m_pCheckImg->QueryInterface(IID_IHTMLElementRender,(void **)&m_pRender);

RECT rc;

m_bmp.GetWindowRect(&rc);

ScreenToClient(&rc);

long t=0;

m_pCheckImg->get_offsetHeight(&t);

rc.bottom=rc.top+t;

m_pCheckImg->get_offsetWidth(&t);

rc.right=rc.left+t-1;

m_bmp.MoveWindow(&rc);

HDC hDc = m_bmp.GetDC()->GetSafeHdc();

m_pRender->DrawToDC(hDc);