当前位置:  开发笔记 > 编程语言 > 正文

阻止.NET WebBrowser控件中的对话框

如何解决《阻止.NETWebBrowser控件中的对话框》经验,为你挑选了4个好方法。

我有一个.NET 2.0 WebBrowser控件,用于导航一些没有用户交互的页面(不要问......长篇故事).由于此应用程序的用户性质较少,我已将WebBrowser控件的ScriptErrorsSuppressed属性设置为true,VS 2005状态中包含的文档将"隐藏其源自底层ActiveX控件的所有对话框,不只是脚本错误." 但是,MSDN文章没有提到这一点.我已经设法取消了NewWindow事件,这会阻止弹出窗口,因此需要处理.

任何人都有使用其中一个并成功阻止所有对话框,脚本错误等的经验?

编辑

这不是IE的独立实例,而是生成在Windows窗体应用程序上的WebBrowser控件的实例.任何人都有使用此控件或底层AxSHDocVW的经验吗?

再次编辑

对不起,我忘了提这个...我试图阻止一个JavaScript警报(),只需一个OK按钮.也许我可以转换成IHTMLDocument2对象并以这种方式访问​​脚本,我已经使用过MSHTML了,有人都知道吗?



1> Sire..:

并且为了一个简单的方法来注入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);
}



2> David Mohund..:

这绝对是hacky,但如果你使用WebBrowser控件做任何工作,你会发现自己做了很多hacky的东西.

这是我所知道的最简单的方法.你需要注入JavaScript来覆盖警报功能......这就像注入这个JavaScript函数一样:

window.alert = function () { }

很多方法可以做到这一点,但很有可能.一种可能性是挂钩DWebBrowserEvents2接口的实现.完成此操作后,您可以插入NavigateComplete,DownloadComplete或DocumentComplete(或者,正如我们所做的,它的一些变体),然后调用您已实现的执行此覆盖window.alert的InjectJavaScript方法.方法.

就像我说的,hacky,但它的工作:)

如果需要,我可以详细介绍.



3> Jim Crafton..:

您可能需要自定义一些内容,查看IDocHostUIHandler,然后查看其他一些相关的界面.您可以进行相当多的控制,甚至可以自定义对话框显示/ ui(我无法回想起这个界面).我很确定你可以做你想做的事情,但它确实需要在内部进行捣乱,MSHTML并能够实现各种COM接口.

其他一些想法:http: //msdn.microsoft.com/en-us/library/aa770041.aspx

IHostDialogHelper
IDocHostShowUI

这些可能是您正在实施的内容.



4> Harry..:

防弹警报拦截器:

Browser.Navigated +=
    new WebBrowserNavigatedEventHandler(
        (object sender, WebBrowserNavigatedEventArgs args) => {
            Action blockAlerts = (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"循环.

也许它不是最易读的代码片段,但它适用于现实生活中,格式错误的页面.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有