Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2025143
  • 博文数量: 960
  • 博客积分: 52560
  • 博客等级: 大将
  • 技术积分: 13131
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-31 14:15
文章分类

全部博文(960)

文章存档

2011年(1)

2008年(959)

我的朋友

分类: C/C++

2008-08-01 16:54:54

下载本文示例代码
下载示例工程

一、介绍
网页中的密码输入框和一般不同,它没有句柄之类的,但是通过获取IE的IHTMLInputTextElement接口,就可以获取网页中的输入框(包括文本和密码输入框)的内容了。

源代码在VC知识库首页运行效果图如下:



二、具体代码
	VARIANT id, index;

	CComPtr 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("  【应该是密码】"));

															}

														}

												}

										}

								}

							}

					}

					

				}

				

			}

			

		}

    }
注意:由于我也比较懒,本文框架是采用一篇名为《如何控制IE的行为》...在这里感谢原文作者,但是本文的主要代码是我写的,(其实自己写一个框架也太简单了,但是我还要上班啊 :( 请原谅!)最好不要向作者要技术支持!谢谢阅读!

下载本文示例代码
阅读(318) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~