大家好,我用下面方法给网页一个元素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);  

解决方案 »

  1.   

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

  2.   

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

  3.   

    如果只是click,调用IHTMLElement::click 方法就可以了,它会自动触发onclick事件但是有些页面不一定是在onclick中进行处理的,比如,它可以选则在双击,或者onkeydown中进行处理。你看看页面的源代码就知道它具体是在什么事件中进行处理的了
      

  4.   

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

  5.   

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

  6.   

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

  7.   

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

  8.   

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

  9.   

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