首先,大部分操作都需要用到头文件
#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("[email protected]");
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);