分类: C/C++
2008-03-31 14:33:43
一、介绍
网页中的密码输入框和一般不同,它没有句柄之类的,但是通过获取IE的IHTMLInputTextElement接口,就可以获取网页中的输入框(包括文本和密码输入框)的内容了。
源代码在VC知识库首页运行效果图如下:
二、具体代码
VARIANT id, index; CComPtr注意:由于我也比较懒,本文框架是采用一篇名为《如何控制IE的行为》...在这里感谢原文作者,但是本文的主要代码是我写的,(其实自己写一个框架也太简单了,但是我还要上班啊 :( 请原谅!)最好不要向作者要技术支持!谢谢阅读!spDispatch; CComQIPtr pDoc2; CComPtr pElement; CComPtr pElementCol; CComPtr pFormElement; CComPtr pInputElement; //首先获取IWebBrowser2接口 CoInitialize(NULL); //必须要这句初始化 SHDocVw::IWebBrowser2Ptr spBrowser(spDisp); if (m_spSHWinds == NULL) { if (m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) != S_OK) { MessageBox("Failed"); CoUninitialize(); } } if (m_spSHWinds) { int n = m_spSHWinds->GetCount(); for (int i = 0; i < n; i++) { _variant_t v = (long)i; IDispatchPtr spDisp = m_spSHWinds->Item(v); SHDocVw::IWebBrowser2Ptr spBrowser(spDisp); //生成一个IE窗口的智能指针 if (spBrowser) { //获取IHTMLDocument2接口 if (SUCCEEDED(spBrowser->get_Document( &spDispatch))) pDoc2 = spDispatch; if(pDoc2!=NULL) { // AfxMessageBox("已经获取IHTMLDocument2"); if (SUCCEEDED(pDoc2->get_forms(&pElementCol))) { // AfxMessageBox("已经获取IHTMLElementCollection"); long p=0; if(SUCCEEDED(pElementCol->get_length(&p))) 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))) { // AfxMessageBox("已经获取IHTMLFormElement"); long q=0; if(SUCCEEDED(pFormElement->get_length(&q))) 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_IHTMLInputTextElement,(void**)&pInputElement))) { //AfxMessageBox("已经获取IHTMLInputTextElement"); CComBSTR value; CComBSTR type; pInputElement->get_type(&type); //获取输入框类型(密码框还是文本框) CString strtype(type); strtype.MakeUpper(); if(strtype.Find("TEXT")!=-1) //获取文本框的值 { pInputElement->get_value(&value); CString str(value); if(!str.IsEmpty()) m_ctrlIE.InsertItem(0, _bstr_t(value)+_bstr_t(" 【可能是用户名或其他需提交的内容】")); } else if(strtype.Find("PASSWORD")!=-1) //获取密码框的值 { pInputElement->get_value(&value); CString str(value); if(!str.IsEmpty()) m_ctrlIE.InsertItem(0, _bstr_t(value) + _bstr_t(" 【应该是密码】")); } } } } } } } } } } }