WebBrowser 控件:即使 .Silent 为真,导航也会显示错误消息框
Posted
技术标签:
【中文标题】WebBrowser 控件:即使 .Silent 为真,导航也会显示错误消息框【英文标题】:WebBrowser control: Navigate shows error message box even though .Silent is true 【发布时间】:2014-04-07 16:32:05 【问题描述】:我正在托管一个 Web 浏览器控件,初始化为 IWebBrowser2.put_Silent(VARIANT_TRUE)
。
但是,当使用格式错误的路径调用 IWebBrowser2.Navigate
时,我仍然会收到一个消息框,相当于
“file:///D://htmlstuff/page.html”未找到。确保路径或 Internet 地址正确。
这里的问题是用户指定的意外双斜杠(D:\htmlstuff 而不是 D:\htmlstuff)。
在进行导航之前,我可以更早地发现这个特定问题,但我担心这个消息框仍然会出现,因为我无法验证每个可能的 URL(或其他可能导致 webbrowser 控件忽略 Silent 标志的原因) .
我希望得到一个静默返回的错误代码。
有什么想法吗?有没有“更安静”的选项?
Windows 8.0、IE 10.0.9200.16750
【问题讨论】:
【参考方案1】:这是我在使用 VBA 和 UserForms 时遇到的 WebBrowser 控件的一个令人讨厌的行为。 我的解决方法是将目标 URL 加载到一个小型托管页面中的 iframe 中。这 方式不会弹出警报,您可以查询目标 URL 是否确实加载了。
使用<PathTo>/framehost.html#<TargetURL>
调用托管页面
<!DOCTYPE html>
<head>
<title>Frame Host</title>
<script>
window.onload = function()
var frame = document.getElementById('MyFrame');
frame.src = location.hash.substring(1);
frame.onload = function()
try
var doc = frame.contentDocument;
alert("Loaded " + frame.src);
catch(e)
alert("Failed to load " + frame.src)
</script>
</head>
<body>
<iframe id="MyFrame" src="about:blank"></iframe>
</body>
</html>
【讨论】:
【参考方案2】:尝试在底层 WebBrowser ActiveX 控件上处理 NavigateError
事件。我有an example 展示了如何处理“基础”WebBrowser
这样的事件。它适用于 WPF,但它可以轻松适配 WinForms(使用WebBrowser.ActiveXInstance
)。
另外,我认为您应该能够通过实现IDocHostShowUI::ShowMessage
来处理此类消息。我有another example 展示了如何在WebBrowser
站点对象上实现IDocHostUIHandler
。同样的方法可以用于IDocHostShowUI
。
免责声明:我尚未验证这两种潜在解决方案中的任何一种。
【讨论】:
谢谢! - 我尝试了 NavigateError,但它没有触发。根据 msdn (msdn.microsoft.com/en-us/library/aa753269(v=vs.85).aspx) 的说法,IDocHostSHowUI 似乎更难实现,因为它需要在也实现 IOleClientSite 的对象上实现 我已经很久没有搞砸了,但是看看这个:WebBrowserEx - Extended WebBrowser Control。 @peterchen,你可以继承基础的IOleClientSite
:***.com/q/19717787/1768303
@Noseratio: C++/ATL 不幸的是(我已经修复了误导性标签)。 groups.google.com/d/msg/microsoft.public.vc.atl/tPB41rx6XAs/… 是我能找到的最接近的。无论如何,谢谢!
@peterchen,没问题。我还有另一个code snippet,它可能有助于使用ATL :) 如果IDocHostSHowUI
确实有效,您可以随时求助于CBTHook。以上是关于WebBrowser 控件:即使 .Silent 为真,导航也会显示错误消息框的主要内容,如果未能解决你的问题,请参考以下文章
vb Webbrowser中发生脚本运行错误,但是用WebBrowser1.Silent=true后相当网页还是运行不正常,该怎么解决