Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9726747
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-03-31 14:33:43

下载本文示例代码



一、介绍
网页中的密码输入框和一般不同,它没有句柄之类的,但是通过获取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的行为》...在这里感谢原文作者,但是本文的主要代码是我写的,(其实自己写一个框架也太简单了,但是我还要上班啊 :( 请原谅!)最好不要向作者要技术支持!谢谢阅读!
下载本文示例代码
阅读(1454) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~