关于IHtmlelement3 :: FireEvent不产生实际效果的问题

时间:2022-02-26 23:50:10
大家好,我用下面方法给网页一个元素fire onclick消息,返回值都是成功的,但是实际上没有操作效果,问题出在哪里呢?请大家支招,谢谢!

CComQIPtr<IHTMLDocument2> spDoc2;
CComQIPtr<IDispatch> spDoc2Disp;
spEle->get_document(&spDoc2Disp);
if(spDoc2Disp == NULL)
return 1;

spDoc2 = spDoc2Disp;

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

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(spEle);  


VARIANT_BOOL varbResult;  
CComVariant varEvent = spEvent;  

hr = spEle3->fireEvent(eventName, &varEvent, &varbResult);  

13 个解决方案

#1


首选你要确定这个element的处理确实是在onclick中

#2


我对html的处理不是特别了解,我想达到的目的就是:系统使用FireEvent方法自动的点击(包括左键和右键点击)操作网页上的一个元素,就像我们直接用鼠标点击操作一样,你所提到的“element的处理确实是在onclick中”,这个不太理解,能否给出点详细解释,十分感谢!

#3


如果只是click,调用IHTMLElement::click 方法就可以了,它会自动触发onclick事件

但是有些页面不一定是在onclick中进行处理的,比如,它可以选则在双击,或者onkeydown中进行处理。你看看页面的源代码就知道它具体是在什么事件中进行处理的了

#4


1, "onclick"是错误的事件名;
2. IHTMLElement有click方法,直接用就是了.何必多此一举?

关于IHtmlelement3 :: FireEvent不产生实际效果的问题
=======================================================
FreeLaxy, your backup.
=======================================================

#5


上面两位楼友好,IHTMLElement的click方法我知道,这个可以模拟系统的鼠标左键点击操作,我现在希望不仅仅是模拟左键点击,我还需要模拟双击、右键点击等操作,这个用FireEvent到底可以实现么?我现在很困惑,不知道思路上到底哪里出现了错误或断层,请上面两位老兄给点指点!多谢!

#6


说简单也简单, 先算出目标element的位置, 然后想HWND=Internet Explorer_sever发送鼠标消息, 根据试验, 即使窗口不在前台(focus/foreground), 仍然会傻乎乎地接受鼠标和键盘消息.别告诉MS

关于IHtmlelement3 :: FireEvent不产生实际效果的问题
=======================================================
FreeLaxy, your backup.
=======================================================

#7


好的,我试试看,成功的话,马上结贴!非常感谢

#8


如果不成功, 不是我的方法不对, 而是你的代码没到位, 请不要找借口不结贴.

关于IHtmlelement3 :: FireEvent不产生实际效果的问题
=======================================================
FreeLaxy, your backup.
=======================================================

#9


请兄弟放心!! 做事先做人,呵呵!

#10


兄弟不放心, IHTMLElement的rect不好算, 特别是嵌套FRAME,DIV带滚动条时,够你一个周折腾的.

关于IHtmlelement3 :: FireEvent不产生实际效果的问题
=======================================================
FreeLaxy, your backup.
=======================================================

#11


哈哈,我先找个最简单的情况测测看

#12


freelaxy 朋友:
我进行了如下测试,正确获取了Internet Explorer_sever 句柄HWND,正确获取了元素在客户区的坐标,如果网页在前端,下面消息发送是正确的,可以正确点击。但是如果页面没有在前端,就无法模拟,
上回朋友所说的“根据试验, 即使窗口不在前台(focus/foreground), 仍然会傻乎乎地接受鼠标和键盘消息”,这个是怎么实现的?难道是我下面发送消息的模式不对,还是我忽略什么关键地方?请指正!非常感谢!

::SendMessage(hIEServer,WM_LBUTTONDOWN,NULL,MAKELONG(pt.x,pt.y));
::SendMessage(hIEServer,WM_LBUTTONUP,NULL,MAKELONG(pt.x,pt.y));

#13


学习了!留个脚印

#1


首选你要确定这个element的处理确实是在onclick中

#2


我对html的处理不是特别了解,我想达到的目的就是:系统使用FireEvent方法自动的点击(包括左键和右键点击)操作网页上的一个元素,就像我们直接用鼠标点击操作一样,你所提到的“element的处理确实是在onclick中”,这个不太理解,能否给出点详细解释,十分感谢!

#3


如果只是click,调用IHTMLElement::click 方法就可以了,它会自动触发onclick事件

但是有些页面不一定是在onclick中进行处理的,比如,它可以选则在双击,或者onkeydown中进行处理。你看看页面的源代码就知道它具体是在什么事件中进行处理的了

#4


1, "onclick"是错误的事件名;
2. IHTMLElement有click方法,直接用就是了.何必多此一举?

关于IHtmlelement3 :: FireEvent不产生实际效果的问题
=======================================================
FreeLaxy, your backup.
=======================================================

#5


上面两位楼友好,IHTMLElement的click方法我知道,这个可以模拟系统的鼠标左键点击操作,我现在希望不仅仅是模拟左键点击,我还需要模拟双击、右键点击等操作,这个用FireEvent到底可以实现么?我现在很困惑,不知道思路上到底哪里出现了错误或断层,请上面两位老兄给点指点!多谢!

#6


说简单也简单, 先算出目标element的位置, 然后想HWND=Internet Explorer_sever发送鼠标消息, 根据试验, 即使窗口不在前台(focus/foreground), 仍然会傻乎乎地接受鼠标和键盘消息.别告诉MS

关于IHtmlelement3 :: FireEvent不产生实际效果的问题
=======================================================
FreeLaxy, your backup.
=======================================================

#7


好的,我试试看,成功的话,马上结贴!非常感谢

#8


如果不成功, 不是我的方法不对, 而是你的代码没到位, 请不要找借口不结贴.

关于IHtmlelement3 :: FireEvent不产生实际效果的问题
=======================================================
FreeLaxy, your backup.
=======================================================

#9


请兄弟放心!! 做事先做人,呵呵!

#10


兄弟不放心, IHTMLElement的rect不好算, 特别是嵌套FRAME,DIV带滚动条时,够你一个周折腾的.

关于IHtmlelement3 :: FireEvent不产生实际效果的问题
=======================================================
FreeLaxy, your backup.
=======================================================

#11


哈哈,我先找个最简单的情况测测看

#12


freelaxy 朋友:
我进行了如下测试,正确获取了Internet Explorer_sever 句柄HWND,正确获取了元素在客户区的坐标,如果网页在前端,下面消息发送是正确的,可以正确点击。但是如果页面没有在前端,就无法模拟,
上回朋友所说的“根据试验, 即使窗口不在前台(focus/foreground), 仍然会傻乎乎地接受鼠标和键盘消息”,这个是怎么实现的?难道是我下面发送消息的模式不对,还是我忽略什么关键地方?请指正!非常感谢!

::SendMessage(hIEServer,WM_LBUTTONDOWN,NULL,MAKELONG(pt.x,pt.y));
::SendMessage(hIEServer,WM_LBUTTONUP,NULL,MAKELONG(pt.x,pt.y));

#13


学习了!留个脚印