WebBrowser控件:检测导航失败

时间:2009-07-30 13:17:34

标签: c++ webbrowser-control

我正在托管一个webbrowser控件,通常会加载外部文档,然后使用HTML DOM进行一些修改。

我们还使用虚假协议嵌入自定义应用程序链接,例如在BeforeNavigate2中捕获和处理的“关闭此内容”。

当链接tarket拼写错误(例如,“spp:CloseWindow”)时,BeforeNavigate将不会触发自定义处理。浏览器控件不显示导航错误,但仍保留在READYSTATE_INTERACTIVE中,并且不会触发NavigateCompleteDocumentComplete


我的问题: 大多数操作(例如,检索或更新内容)被延迟并等待状态达到READYSTATE_COMPLETE。点击这样的无效链接后,浏览器不再更新 - 我想避免的状态。 我怎么能这样做?

  • 我可以在“DownloadComplete”中检测到导航失败了吗? (所以我可以将测试放宽到"READYSTATE_COMPLETEREADYSTATE_INTERACTIVE and last downloadComplete was broken“)
  • 我可以将浏览器控件“重置”为READYSTATE_COMPLETE(可能不是)
  • 我可以检测浏览器实际支持的伪协议吗?

(事后看来,使用xxxx:前缀并不是一个好主意,但现在改变它有点问题。)

2 个答案:

答案 0 :(得分:6)

我相信Internet Explorer和Windows在UrlMon.dll中实现了可扩展的可用协议列表。请参阅此处了解IE architecture

您无法在BeforeNavigate中检测到错误协议的原因是协议未知,因此不会发生真正的导航。浏览器决定显示错误页面。错误页面导航显然不会引发所有正常事件。

然而,有一种方法可以检测导航在杂草中的时间。如果您连接到Web浏览器的DocumentCompleted事件,则可以扫描与错误相关联的特定URL,或者更一般地,扫描以res://ieframe.dll开头的URL。

示例:

  • RES://ieframe.dll/unknownprotocol.htm#spp:CloseWindow
  • RES://ieframe.dll/dnserrordiagoff_webOC.htm# http://192 ...

更简洁的方法是挂钩DWebBrowserEvents2 interface

的NavigateError

答案 1 :(得分:0)

我们在托管网络浏览器控件( Google地图)时出现问题,因为我们会收到导航已完成通知(NavigateComplete),但网页本身没有完成渲染。为解决此问题,我们添加了一个notifyInitialised javascript函数,该函数只是导航到'app:// onInitialised' - 您正在使用的类似机制。

也许你可以这样(如果你可以控制用户导航到的页面)。您可以添加此通知机制并在代码中检查它。如果在规定的超时后没有收到,你可以假设出错了并显示相关信息。

如果您有兴趣,我们还使用了一种机制,可以直接调用我们在herehere所述的C ++代码中调用javascript函数。