[HELP]如何触发页面中链接的onclick事件?

aa_22_999 2010-11-03 11:51:03
用下面的代码可以实现,把指定的网站加载到WebBrowse控件中,
然后向文本框填充数据,并且可以通过找Button链接的坐标,
用mouse_evetn事件提交表单。

如果调整屏幕分辨率或换别的电脑,找坐标可能不准确,
是否可以通过getElementByTagName找标签,然后触发onclick?

请大家帮忙看下,谢谢。。。

// WebTestDlg.h : header file
class CWebTestDlg : public CDialog
{
CWebBrowser2 m_ctrlWeb;
};

// WebTestDlg.cpp : implementation file
//引用HTML相关头文件
#include <atlbase.h>
CComModule _Module;
#include <mshtml.h>
#include <atlcom.h>

#include <string>
using namespace std;

//声明自动提交表单的函数
void PutFormValue(IHTMLDocument2 * pIHTMLDocument2);

BOOL CWebTestDlg::OnInitDialog()
{
//默认打开移动宽带网站
m_ctrlWeb.Navigate("http://221.178.143.198:7001/style/default/default.jsp",NULL,NULL,NULL,NULL);
return TRUE; // return TRUE unless you set the focus to a control
}

//实现自动提交表单
void PutFormValue(IHTMLDocument2 * pIHTMLDocument2)
{
if(!pIHTMLDocument2)
return;

HRESULT hr;
CComBSTR bstrTitle;

//获取加载页面的标题
pIHTMLDocument2->get_title( &bstrTitle );
USES_CONVERSION;

CComQIPtr<IHTMLElementCollection>spElementCollection;
hr = pIHTMLDocument2->get_forms( &spElementCollection );
if (FAILED(hr))
{
AfxTrace(_T("获取表单的集合 IHTMLElementCollection 错误"));
return;
}

long nFormCount=0;

//获取表单数目
hr = spElementCollection->get_length( &nFormCount );
if ( FAILED( hr ) )
{
AfxTrace( _T("获取表单数目错误"));
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;

CString strName;
CString strVal;
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"); //未知类型

strName = lpName;
strName.TrimLeft();
strName.TrimRight();

//向用户名文本框内填充数据
if (strName == "UserName")
{
TCHAR szText[32] = "123456";
CComVariant vMyVal = (LPCTSTR)(szText);
spInputElement.PutPropertyByName( L"value",&vMyVal);
}

//向密码文本框内填充数据
if (strName == "PassWord")
{
TCHAR szText[32] = "789";
CComVariant vMyVal = (LPCTSTR)(szText);
spInputElement.PutPropertyByName( L"value",&vMyVal);
}
} //for(long j=0; j<nElemCount; j++)

//提交表单,感觉象是按了F5刷新
//页面没跳转到提示用户名和密码错误的页面
//spFormElement->submit();
} //for(long i=0; i<nFormCount; i++)
}

//测试自动提交表单
void CWebTestDlg::OnButton1()
{
//创建IHTMLDocument2类型的对象
CComPtr <IDispatch> spDispDoc;
spDispDoc = m_ctrlWeb.GetDocument();
CComQIPtr<IHTMLDocument2> spDocument2 = spDispDoc;
if (!spDocument2)
return;

PutFormValue(spDocument2);

//模拟鼠标单击
::SetCursorPos(350,420);
Sleep(500);
::mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
Sleep(500);
::mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
Sleep(100);
}
...全文
278 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
aa_22_999 2010-11-03
回复
aa_22_999 2010-11-03
之前发的帖子页面加载到WebBrowse中无法提交表单
http://topic.csdn.net/u/20101102/20/9a9fa76a-2d14-4ca3-94f4-4f9020667386.html


//移动宽带连接的网站
http://221.178.143.198:7001/style/default/default.jsp

<tr>
<td height="50" colspan="2" align="center">
<div class="log">
<a href="#" onclick="onCheck()">登 录</a>
</div>
</td>
</tr>
回复
sos_2010123 2010-11-03
没有id, name, value属性的 Hyer Link链接Button,
听说可以用GetElementByTagName来获取一个对象(假设是A),
然后A.Click(),就可以模拟鼠标单击;

VC6下好象不支持IHtmlElement2,IHtmlElement3,IHtmlElement4
等接口...
回复
向立天 2010-11-03
[Quote=引用 8 楼 aa_22_999 的回复:]
VC6 是否支持IHtmlElement2接口呢???
[/Quote]
呵呵
连续三次恢复了
帮你一把吧
你在用VC6?
改用2005吧
回复
aa_22_999 2010-11-03
VC6 是否支持IHtmlElement2接口呢???
回复
aa_22_999 2010-11-03
在线等。。。
回复
aa_22_999 2010-11-03
spInputElement.GetPropertyByName,
获取不到这个连接按纽,因为没有 name值。
回复
向立天 2010-11-03
[Quote=引用 4 楼 aa_22_999 的回复:]
引用 3 楼 xianglitian 的回复:
mouse_event不好用么


----------------
换别的电脑,
或调整屏幕分辨率,坐标获取就不准确啦,
还有就是,如果把把WebBrowse所在的窗体隐藏,
也会影响程序的运行。。。
[/Quote]
这确实是个问题
不过对于操作web控件本身的方法我就不太熟悉了
回复
aa_22_999 2010-11-03
[Quote=引用 3 楼 xianglitian 的回复:]
mouse_event不好用么
[/Quote]

----------------
换别的电脑,
或调整屏幕分辨率,坐标获取就不准确啦,
还有就是,如果把把WebBrowse所在的窗体隐藏,
也会影响程序的运行。。。
回复
向立天 2010-11-03
mouse_event不好用么
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2010-11-03 11:51
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……