Internet explorer 如何确定鼠标单击并等待事件生成BeforeNavigate2的时间? 正如我在其他问题中所说的,我正在为开源浏览器自动化框架()提供贡献,并且在IE方面有困难。框架使用C++编写的外部进程,而不是浏览器助手对象(BHO)。元素上的点击是使用Windows消息(WM_LBUTTONDOWN和WM_LBUTTONUP)生成的,而不是通过COM模拟点击。此设计决策的理由可以在项目的wiki中找到

Internet explorer 如何确定鼠标单击并等待事件生成BeforeNavigate2的时间? 正如我在其他问题中所说的,我正在为开源浏览器自动化框架()提供贡献,并且在IE方面有困难。框架使用C++编写的外部进程,而不是浏览器助手对象(BHO)。元素上的点击是使用Windows消息(WM_LBUTTONDOWN和WM_LBUTTONUP)生成的,而不是通过COM模拟点击。此设计决策的理由可以在项目的wiki中找到,internet-explorer,automation,Internet Explorer,Automation,为了确定导航是否已启动,将驱动程序代码附加到DWebBrowserEvents2::BeforeNavigate2事件。但是,在将单击消息发送到IE窗口后,SendMessage返回(表示IE消息循环已处理该消息)与BeforeNavigate2触发之间会有一些延迟。我想我可以使用attachEvent将回调函数附加到HTML元素的onclick事件,并等待该事件得到处理,但我不确定这是否与BeforeNavigate2事件同步 如果不调用Windows Sleep()函数任意时间,在发送由Wi

为了确定导航是否已启动,将驱动程序代码附加到DWebBrowserEvents2::BeforeNavigate2事件。但是,在将单击消息发送到IE窗口后,SendMessage返回(表示IE消息循环已处理该消息)与BeforeNavigate2触发之间会有一些延迟。我想我可以使用attachEvent将回调函数附加到HTML元素的onclick事件,并等待该事件得到处理,但我不确定这是否与BeforeNavigate2事件同步


如果不调用Windows Sleep()函数任意时间,在发送由Windows消息模拟的鼠标单击后,如何等待BeforeNavigate2事件?

导航代码都是异步的,因此您所能做的就是接收DWBE2::BeforeNavigate2并等待它触发。您不必睡觉,只需让消息循环运行即可

没有办法在事情发生之前就知道会发生什么。有很多简单的例子,例如“它是一个
标记,但是有几乎无限多的方法来导航IE。一个例子是在随机元素上放置
onclick
处理程序,然后使用
setTimeout()
以某种偷偷摸摸的方式导航浏览器,或根据随机数导航。另一种方法是嵌入一个xml文件,其中包含xsl样式表,顶部有一个CDATA块,其中包含通过document.write()更改window.location的javascript(严重的弹出窗口阻止程序必须处理这种情况)


因此,基本上,如果不事先做大量分析(即解析HTML、javascript等),就无法判断。让BeforeNavigate2事件接收器引发事件,然后发送单击消息的进程等待事件(以及其他安全超时),怎么样


似乎没有被描述在你为什么要等待的情况下,如果点击之后的下一个动作只有在导航成功的情况下才会发生——也许这应该是用户可以配置的。

是的,但是问题是你根本不能依赖BeFoEnavigaT2开机。ked on不是一个链接,而是一个div,这对于浏览器自动化框架来说并不少见。我希望我可以事先确定是否会发生导航,然后等待事件发生。遗憾的是,这似乎不可能。我目前正在IHTMLElement上试验attachEvent,以确保知道DOM何时处理了单击,但没有调用我的事件处理程序。无法确定。我可以注册一个使用setTimeout()的onclick处理程序在任意时间段后导航浏览器。在知道将发生什么之前,唯一的方法是完全解析和分析HTML和JavaScript,或者发明一个时间机器。同样,您不能依靠单击生成导航。可能是单击只运行JavaScript函数来操纵DOM(在许多JS小部件框架中很常见)。您将等待未生成导航的每次单击的整个超时时间。等待行为的基本原理是,自动脚本在单击导航后的下一个操作可能指向目标页面,因此我们必须等待导航完成后才能继续。我认为在自动机中ion脚本可以通过某种方式指定等待页面加载,或者将脚本分成多个部分,以便在新加载的页面上运行的脚本是由于页面加载而不是由于上一页触发的。对我来说,这似乎应该是脚本中做出的某个决定,而不是留给click命令的设计。