我有一个.NET 2.0 WebBrowser控件,用于导航一些没有用户交互的页面(不要问......长篇故事).由于此应用程序的用户性质较少,我已将WebBrowser控件的ScriptErrorsSuppressed属性设置为true,VS 2005状态中包含的文档将"隐藏其源自底层ActiveX控件的所有对话框,不只是脚本错误." 但是,MSDN文章没有提到这一点.我已经设法取消了NewWindow事件,这会阻止弹出窗口,因此需要处理.
任何人都有使用其中一个并成功阻止所有对话框,脚本错误等的经验?
编辑
这不是IE的独立实例,而是生成在Windows窗体应用程序上的WebBrowser控件的实例.任何人都有使用此控件或底层AxSHDocVW的经验吗?
再次编辑
对不起,我忘了提这个...我试图阻止一个JavaScript警报(),只需一个OK按钮.也许我可以转换成IHTMLDocument2对象并以这种方式访问脚本,我已经使用过MSHTML了,有人都知道吗?
并且为了一个简单的方法来注入javascript的神奇系列,请阅读如何将javascript注入webbrowser控件.
或者只使用这个完整的代码:
private void InjectAlertBlocker() { HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0]; HtmlElement scriptEl = webBrowser1.Document.CreateElement("script"); string alertBlocker = "window.alert = function () { }"; scriptEl.SetAttribute("text", alertBlocker); head.AppendChild(scriptEl); }
这绝对是hacky,但如果你使用WebBrowser控件做任何工作,你会发现自己做了很多hacky的东西.
这是我所知道的最简单的方法.你需要注入JavaScript来覆盖警报功能......这就像注入这个JavaScript函数一样:
window.alert = function () { }
有很多方法可以做到这一点,但很有可能.一种可能性是挂钩DWebBrowserEvents2接口的实现.完成此操作后,您可以插入NavigateComplete,DownloadComplete或DocumentComplete(或者,正如我们所做的,它的一些变体),然后调用您已实现的执行此覆盖window.alert的InjectJavaScript方法.方法.
就像我说的,hacky,但它的工作:)
如果需要,我可以详细介绍.
您可能需要自定义一些内容,查看IDocHostUIHandler
,然后查看其他一些相关的界面.您可以进行相当多的控制,甚至可以自定义对话框显示/ ui(我无法回想起这个界面).我很确定你可以做你想做的事情,但它确实需要在内部进行捣乱,MSHTML
并能够实现各种COM
接口.
其他一些想法:http: //msdn.microsoft.com/en-us/library/aa770041.aspx
IHostDialogHelper IDocHostShowUI
这些可能是您正在实施的内容.
防弹警报拦截器:
Browser.Navigated += new WebBrowserNavigatedEventHandler( (object sender, WebBrowserNavigatedEventArgs args) => { ActionblockAlerts = (HtmlDocument d) => { HtmlElement h = d.GetElementsByTagName("head")[0]; HtmlElement s = d.CreateElement("script"); IHTMLScriptElement e = (IHTMLScriptElement)s.DomElement; e.text = "window.alert=function(){};"; h.AppendChild(s); }; WebBrowser b = sender as WebBrowser; blockAlerts(b.Document); for (int i = 0; i < b.Document.Window.Frames.Count; i++) try { blockAlerts(b.Document.Window.Frames[i].Document); } catch (Exception) { }; } );
此示例假定您在命名空间中添加了Microsoft.mshtml引用," 使用mshtml; ",而浏览器是您的WebBrowser实例.
为什么它是防弹的?首先,它处理帧内的脚本.然后,当文档中存在特殊的"杀手框架"时,它不会崩溃.阿"杀手帧"是这引起了上尝试使用它作为HtmlWindow对象异常的帧.Document.Window.Frames上使用的任何"foreach"都会导致异常,因此必须在try/catch块中使用更安全的"for"循环.
也许它不是最易读的代码片段,但它适用于现实生活中,格式错误的页面.