在VC中操纵网页可以提交获取某个input中的值

本文介绍了一个函数用于在指定表单中查找具有特定标记和名称的元素。通过遍历表单和表单域,该函数实现了元素的定位。此外,文章还展示了如何枚举并操作系统中的浏览器实例,以获取网页上的所有表单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 首先写一个函数

BOOL CPost::FindSpecifiedElement(CString &csFormName, //元素所在表单名称

CString &csElementTag,  //元素标记名称

CString &csElementName  //元素名称

)

{

 if(csFormName.IsEmpty()||csElementTag.IsEmpty()||

       csElementName.IsEmpty())

    return false;

 bool retVal=false;

 IDispatch* pDisp=NULL;

 IHTMLDocument2* pHTMLDocument2=NULL;

    HRESULT hr=-1;

 pDisp = m_browser.GetDocument();

 

 if (pDisp == NULL )

 {

  TRACE("can not fetch document interface\n");

  return retVal;

 }

  

 hr = pDisp->QueryInterface( IID_IHTMLDocument2, (void**)&pHTMLDocument2 );

 if (pHTMLDocument2==NULL)  // fetch IHTMLDocument2 infterface failed

 {

   TRACE("can not fetch document interface\n");

   pDisp->Release();

   return retVal;

 }

 EnumForm(  pHTMLDocument2 );

    return retVal;

}

 

void CPost::EnumForm( IHTMLDocument2 * pIHTMLDocument2 )

{

 CString StrInfo;

 StrInfo = "";

 if( !pIHTMLDocument2 ) return;

 HRESULT hr;

 CComBSTR bstrTitle;

 pIHTMLDocument2->get_title( &bstrTitle );

 if (bstrTitle=="Ask361")

 {

  //StrInfo += (CString)bstrTitle;

  //StrInfo +="\r\n";

  USES_CONVERSION;

  CComQIPtr< IHTMLElementCollection > spElementCollection;

  hr = pIHTMLDocument2->get_forms( &spElementCollection ); //取得表单集合

  if ( FAILED( hr ) )

  {

   return;

  }

  long nFormCount=0;    //取得表单数目

  hr = spElementCollection->get_length( &nFormCount );

  if ( FAILED( hr ) )

  {

   return;

  }

  

  for(long i=0; i<nFormCount; i++)

  {

   IDispatch *pDisp = NULL; //取得第 i 项表单

   hr = spElementCollection->item( CComVariant( i ), CComVariant(), &pDisp );

   if ( FAILED( hr ) )  continue;

   CComQIPtr< IHTMLFormElement > spFormElement = pDisp;

   pDisp->Release();

   long nElemCount=0;   //取得表单中 域 的数目

   hr = spFormElement->get_length( &nElemCount );

   if ( FAILED( hr ) )  continue;

   for(long j=0; j<nElemCount; j++)

   {

    CComDispatchDriver spInputElement; //取得第 j 项表单域

    hr = spFormElement->item( CComVariant( j ), CComVariant(), &spInputElement );

    if ( FAILED( hr ) ) continue;

    CComVariant vName,vVal,vType;  //取得表单域的 名,值,类型

    hr = spInputElement.GetPropertyByName( L"name", &vName );

    if( FAILED( hr ) ) continue;

    hr = spInputElement.GetPropertyByName( L"value", &vVal );

    if( FAILED( hr ) ) continue;

    hr = spInputElement.GetPropertyByName( L"type", &vType );

    if( FAILED( hr ) ) continue;

    LPCTSTR lpName = vName.bstrVal?

      OLE2CT( vName.bstrVal ) : _T("NULL"); //未知域名

    LPCTSTR lpVal  = vVal.bstrVal?

      OLE2CT( vVal.bstrVal  ) : _T("NULL"); //空值,未输入

    LPCTSTR lpType = vType.bstrVal?

      OLE2CT( vType.bstrVal ) : _T("NULL"); //未知类型

    //cout << _T("[") << lpType << _T("] ");

    //cout << lpName << _T(" = ") << lpVal << endl;

    //AfxMessageBox((CString)lpType);

    //AfxMessageBox((CString)lpVal);

    //StrInfo += (CString)lpType;

    //StrInfo +="\r\n";

    //StrInfo += (CString)lpVal;

    //StrInfo +="\r\n";

   }

   //想提交这个表单吗?删除下面语句的注释吧

   //pForm->submit();

  }

  //AfxMessageBox(StrInfo);

 }

}

 

void CPost::EnumIE()

{

    //cout << _T("开始扫描系统中正在运行的浏览器实例") << endl;

 CComPtr< IShellWindows > spShellWin;

 HRESULT hr = spShellWin.CoCreateInstance( CLSID_ShellWindows );

 if ( FAILED ( hr ) )

 {

  //cout << _T("获取 IShellWindows 接口错误") << endl;

  return;

 }

 long nCount = 0;  // 取得浏览器实例个数(Explorer 和 IExplorer)

 spShellWin->get_Count( &nCount );

 if( 0 == nCount )

 {

  //cout << _T("没有在运行着的浏览器") << endl;

  return;

 }

 for(int i=0; i<nCount; i++)

 {

  CComPtr< IDispatch > spDispIE;

  hr=spShellWin->Item(CComVariant( (long)i ), &spDispIE );

  if ( FAILED ( hr ) ) continue;

  CComQIPtr< IWebBrowser2 > spBrowser = spDispIE;

  if ( !spBrowser )  continue;

  CComPtr < IDispatch > spDispDoc;

  hr = spBrowser->get_Document( &spDispDoc );

  if ( FAILED ( hr ) ) continue;

  CComQIPtr< IHTMLDocument2 > spDocument2 = spDispDoc;

  if ( !spDocument2 )  continue;

  // 程序运行到此,已经找到了 IHTMLDocument2 的接口指针

  // 删除下行语句的注释,把浏览器的背景改变看看

  // spDocument2->put_bgColor( CComVariant( "green" ) );

  

  EnumForm( spDocument2 );  //枚举所有的表单

 }

}

 

然后这样调用:

 CString FormName,ElementTarget,ElementName;

 FormName= "form1";

 ElementTarget = "input";

 ElementName = "TitleTest";

 if(!FindSpecifiedElement(FormName,ElementTarget,ElementName))

 AfxMessageBox("在当前页面无法找到指定元素");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值