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 为真,导航也会显示错误消息框的主要内容,如果未能解决你的问题,请参考以下文章

怎样让webbrowser执行JS脚本正常显示网页

vb Webbrowser中发生脚本运行错误,但是用WebBrowser1.Silent=true后相当网页还是运行不正常,该怎么解决

如何解决VB中WebBrowser控件持续打开网页占用的内存

delphi禁止webbrowser弹出窗口或者脚本错误

vb的webbrowser控件问题

VB模拟鼠标点击webbrowser控件网页