在CppWebBrowser显示的网页上自动填写用户名密码

lvxiangqun86 2011-11-15 08:40:04
我在C++builder 6.0的开发环境中,用CppWebBrowser控件做了一个模拟的IE浏览器。用它显示一个126邮箱的登录网页,现在我想怎么可以将窗体上的用户名和密码自动添加到126邮箱的网页上,在添加完后,自动点击登录按钮实现登录。
我刚用C++ 不懂,有哪位大侠能给解决一下吗。
...全文
369 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
失落的羊 2012-02-01
  • 打赏
  • 举报
回复
http://blog.csdn.net/tonnyli/article/details/7225975
失落的羊 2012-02-01
  • 打赏
  • 举报
回复
void __fastcall TMainForm::PutInput(TCppWebBrowser *CppWebBrowser1, AnsiString ActionStr)
{
//赋值
AnsiString MyStr = ActionStr;
AnsiString SName,SId,SValue;

SName = MyStr.SubString(1,MyStr.Pos(",")-1);
MyStr = MyStr.SubString(MyStr.Pos(",")+1,MyStr.Length()-MyStr.Pos(","));

SId = MyStr.SubString(1,MyStr.Pos(",")-1);
SValue = MyStr.SubString(MyStr.Pos(",")+1,MyStr.Length());
if(SValue==NULL)SValue="";

VARIANT id, index,id1,index1;
IDispatch *spDispatch;
IHTMLDocument2 *pDoc2;
IHTMLElement *pElement;
IHTMLElementCollection *pElementCol;
IHTMLFormElement *pFormElement;
IHTMLInputElement *pInputElement;//Input
//TonnyLi add
IHTMLTextAreaElement* pTextAreaElement;// TextArea

IDispatch *WebDocument=static_cast<IDispatch*>(CppWebBrowser1->Document);
pDoc2=static_cast<IHTMLDocument2*>(WebDocument);

//首先获取IWebBrowser2接口
if (SUCCEEDED(pDoc2->get_forms(&pElementCol))) //得到form
{
long p=0;
if(SUCCEEDED(pElementCol->get_length(&p))) //哪一个form
if(p!=0)
{
for(long i=0;i<=(p-1);i++)
{
V_VT(&id) = VT_I4;
V_I4(&id) = i;
V_VT(&index) = VT_I4;
V_I4(&index) = 0;

if(SUCCEEDED(pElementCol->item(id,index, &spDispatch)))
{
if(SUCCEEDED(spDispatch->QueryInterface(IID_IHTMLFormElement,(void**)&pFormElement)))
{
long q=0;
if(SUCCEEDED(pFormElement->get_length(&q))) //得到form中的控件个数
for(long j=0;j<=(q-1);j++)
{
V_VT(&id) = VT_I4;
V_I4(&id) = j;
V_VT(&index) = VT_I4;
V_I4(&index) = 0;
if(SUCCEEDED(pFormElement->item(id,index, &spDispatch)))
{
if(SUCCEEDED(spDispatch->QueryInterface(IID_IHTMLElement,(void**)&pElement)))
{
if(SUCCEEDED(spDispatch->QueryInterface(IID_IHTMLInputElement,(void**)&pInputElement)))
{
//AfxMessageBox("已经获取IHTMLInputTextElement");
BSTR Value;
BSTR Type;
BSTR Id;
BSTR Name;

pInputElement->get_type(&Type); //获取类型
pInputElement->get_value(&Value); //获取值
pElement->get_id(&Id);//获取Id的方法不一样
pInputElement->get_name(&Name); //获取它的名字

AnsiString tempName,tempType;
tempType = AnsiString(Type).UpperCase();
if(tempType == "RADIO")
tempName = AnsiString(Name).UpperCase();
else
{ //优先使用name 如果没有则用id
tempName = AnsiString(Name).UpperCase();
if(tempName.IsEmpty())
{
tempName = AnsiString(Id).UpperCase();
if(tempName.IsEmpty())//如果没有name & id
tempName = AnsiString(Type).UpperCase();
}

}
if(tempName!=NULL && ((tempName.Trim()).Length()>0) && tempName == SId.UpperCase())
{
tempName = AnsiString(Type).UpperCase();
if(tempName == "TEXT") //获取和设置文本框的值
{
// WideString temp = SValue;
pInputElement->put_value((WideString)SValue.c_str());

}
else if(tempName == "HIDDEN") //获取和设置hidden 的值
{
pInputElement->put_value((WideString)SValue.c_str());
}

else if(tempName == "PASSWORD") //获取和设置密码框的值
{
pInputElement->put_value((WideString)SValue.c_str());
}
else if(tempName == "RADIO") //获取和设置单选的值
{
pElement->click(); //模拟单击
}
else if(tempName == "CHECKBOX") //获取和设置多选框的值
{
pElement->click(); //模拟单击
// pInputElement->put_checked(j);
}
else if(tempName == "BUTTON") //非提交按钮
{
//pElement->click(); //模拟单击
}
else if(tempName == "SUBMIT") //提交按钮
{
//模拟单击
tempName = AnsiString(Value).UpperCase();
if(tempName==SValue.UpperCase())
pElement->click();
}
break;
}//如果不符,则不做处理
pInputElement->Release();
}
else //不是input框
{
//TonnyLi add begin

if(SUCCEEDED(spDispatch->QueryInterface(IID_IHTMLTextAreaElement,(void**)&pTextAreaElement)))
{//Textarea
BSTR Value;
BSTR Type;
BSTR Id;
BSTR Name;

//pTextAreaElement->get_type(&Type); //获取类型
pTextAreaElement->get_value(&Value); //获取值
pElement->get_id(&Id);//获取Id的方法不一样
pTextAreaElement->get_name(&Name); //获取它的名字

AnsiString tempName,tempType;

tempName = AnsiString(Name).UpperCase();
if(tempName.IsEmpty())
tempName = AnsiString(Id).UpperCase();

//tempName = AnsiString(Id).UpperCase();
if(tempName!=NULL && ((tempName.Trim()).Length()>0) && tempName == SId.UpperCase())
{
pTextAreaElement->put_value((WideString)SValue.c_str());
break;
}
pTextAreaElement->Release();
}//if Textarea
//TonnyLi add
}
pElement->Release();
}//if pelement
spDispatch->Release();
}
}
pFormElement->Release();
}
spDispatch->Release();
}
}
}
}
if(pDoc2) pDoc2->Release();
}
失落的羊 2012-01-31
  • 打赏
  • 举报
回复
明天给你贴段代码,刚好这几天我正弄这个。
失落的羊 2012-01-29
  • 打赏
  • 举报
回复
以前见到类似的例子,搜索一下,应该可以找到。

1,222

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧