WebBrowser如何模仿按钮出发onclick事件,只有类名的情况下,谢谢

a3622041 2018-10-09 02:33:22



COleVariant name;
CComBSTR tag;
long index;
objAllElement-> get_length(&index);
for(long i=0; i <index; i++)//遍历所有元素,通过id属性获取值
{
name.vt=VT_I4;
name.ChangeType(VT_I4);
name.lVal = i;
IDispatch * pDispatch=NULL;
objAllElement-> item(name,name,&pDispatch);
IHTMLElement* spElement;
pDispatch-> QueryInterface(IID_IHTMLElement, (void**)&spElement);
//BSTR tag;
spElement->get_className(&tag);
CString ss(tag);
if(ss == "login-btn-01")
{
name.vt=VT_BSTR;
name.ChangeType(VT_BSTR);
name.bstrVal=tag;
//spElement->click();
objDocument->put_onclick(name);
//objDocument->getElementById();
}
spElement->Release();
}
...全文
221 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2018-10-11
  • 打赏
  • 举报
回复
找到元素之后查询IHTMLElement3然后调用fireEvent 用代码去调用click是不会触发onclick的。put_onclick是修改对onclick事件的处理,也不会触发原本的onclick。
a3622041 2018-10-11
  • 打赏
  • 举报
回复
引用 6 楼 jiangsheng 的回复:
找到元素之后查询IHTMLElement3然后调用fireEvent
用代码去调用click是不会触发onclick的。put_onclick是修改对onclick事件的处理,也不会触发原本的onclick。



IHTMLDocument2 *objDocument=NULL;
CComQIPtr<IHTMLElement, &IID_IHTMLElement>pElement;
objDocument=(IHTMLDocument2*)m_web.get_Document();

CComQIPtr<IHTMLDocument4> spDoc4 = objDocument;
if(spDoc4 == NULL)
return ;

CComPtr<IHTMLEventObj> spEvent;
CComVariant var;
spDoc4->createEventObject(&var, &spEvent);

CComQIPtr<IHTMLEventObj2> spEvent2(spEvent);
CComBSTR eventName = "onclick";
spEvent2->put_type(eventName);

CComQIPtr<IHTMLElement3, &IID_IHTMLElement3> spEle3(pElement);


VARIANT_BOOL varbResult;
CComVariant varEvent = spEvent;

hr = spEle3->fireEvent(eventName, &varEvent, &varbResult);
varbResult =-13108
a3622041 2018-10-11
  • 打赏
  • 举报
回复
引用 6 楼 jiangsheng 的回复:
找到元素之后查询IHTMLElement3然后调用fireEvent
用代码去调用click是不会触发onclick的。put_onclick是修改对onclick事件的处理,也不会触发原本的onclick。


IHTMLDocument3* pDoc3 =(IHTMLDocument3*)m_web.get_Document(); pDoc3 =0X00000是什么原因呀?



VARIANT name;
CComBSTR tag;
long index;
objAllElement-> get_length(&index);
name.vt=VT_I4;
for(long i=0; i <index; i++)//遍历所有元素,通过id属性获取值
{
name.lVal = i;
IDispatch * pDispatch=NULL;
objAllElement-> item(name,name,&pDispatch);
IHTMLElement* spElement;
pDispatch-> QueryInterface(IID_IHTMLElement, (void**)&spElement);
BSTR tag;
spElement->get_className(&tag);
CString ss(tag);
if(ss == "login-btn-01")
{
MessageBox("找到按钮类名")!
}
spElement->Release();
}


这样会有弹窗 但是spElement怎么赋值给IHTMLElement3的地址都是0x000000
赵4老师 2018-10-10
  • 打赏
  • 举报
回复
伦家输入密码是有防止机器人输的功能嘀。
Yofoo 2018-10-10
  • 打赏
  • 举报
回复
这些代码需要运行在主线程, WebBrowser本身需要
修改文字可以试试 IHTMLInputElement.put_value , 另外调试时确认你找到元素是你想要的元素, 别搞错了
a3622041 2018-10-10
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
伦家输入密码是有防止机器人输的功能嘀。


但是他这个没有什么控件呀 主要是没有ID
a3622041 2018-10-10
  • 打赏
  • 举报
回复
引用 2 楼 zzz3265 的回复:
这些代码需要运行在主线程, WebBrowser本身需要
修改文字可以试试 IHTMLInputElement.put_value , 另外调试时确认你找到元素是你想要的元素, 别搞错了


元素这个我肯定找到了。。。我设置断点 写了if语句可以进的去
a3622041 2018-10-09
  • 打赏
  • 举报
回复

HRESULT hr;
LPUNKNOWN lpUnknown;
LPUNKNOWN lpUnknownWB = NULL;
LPUNKNOWN lpUnknownDC = NULL;
IHTMLDocument3* pDoc3 =NULL;
IHTMLElementCollection *objAllElement=NULL;
IHTMLDocument2 *objDocument=NULL;
IHTMLElementCollection *pElement3;
CString strUrl,strTemp;
lpUnknown = m_web.GetControlUnknown();
ASSERT(lpUnknown); if (lpUnknown)
{
hr = lpUnknown->QueryInterface(IID_IUnknown,(LPVOID*)&lpUnknownWB);
ASSERT(SUCCEEDED(hr));
if (FAILED(hr))
return;
hr = pDisp->QueryInterface(IID_IUnknown, (LPVOID*)&lpUnknownDC);
ASSERT(SUCCEEDED(hr));
if (SUCCEEDED(hr) && lpUnknownWB == lpUnknownDC)
{ // The document has finished loading.
strUrl=m_web.get_LocationURL();
if (strUrl.IsEmpty())
{
return ;
}
objDocument=(IHTMLDocument2*)m_web.get_Document();
objDocument->get_all(&objAllElement);
if (strUrl==_T("https://43.4.213.11:2004/"))
{
CComPtr<IDispatch>pDisp;
objAllElement->item(COleVariant(_T("p_pass")),COleVariant((long)0),&pDisp);
CComQIPtr<IHTMLElement, &IID_IHTMLElement>pElement;
if(pDisp==NULL)
{
return;
}
else
{
pElement=pDisp;
pElement->put_innerText(_T("123")); //填充表单
}
COleVariant name;
CComBSTR tag;
long index;
objAllElement-> get_length(&index);
for(long i=0; i <index; i++)//遍历所有元素,通过id属性获取值
{
name.vt=VT_I4;
name.ChangeType(VT_I4);
name.lVal = i;
IDispatch * pDispatch=NULL;
objAllElement-> item(name,name,&pDispatch);
IHTMLElement* spElement;
pDispatch-> QueryInterface(IID_IHTMLElement, (void**)&spElement);
//BSTR tag;
spElement->get_className(&tag);
CString ss(tag);
if(ss == "login-btn-01")
{
name.vt=VT_BSTR;
name.ChangeType(VT_BSTR);
name.bstrVal=tag;
//spElement->click();
objDocument->put_onclick(name);
//objDocument->getElementById();
}
spElement->Release();
}
}
}
}
if (lpUnknownWB)
lpUnknownWB->Release();
if (lpUnknownDC)
lpUnknownDC->Release();

这部分处理的全部代码 现在是无法自动输入密码,按钮也没办法触发 但是我设置一个MessageBox的话 点完弹窗 密码框这个时候还是有密码的

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧