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

时间:2020-03-05 18:57:19  来源:igfitidea点击:

我有一个.NET 2.0 WebBrowser控件,该控件用于在没有用户交互的情况下导航某些页面(不要问...长话短说)。由于该应用程序的用户较少,因此我将WebBrowser控件的ScriptErrorsSuppressed属性设置为true,VS 2005状态随附的文档将隐藏所有来自基础ActiveX控件的对话框,不只是脚本错误。"但是,MSDN文章没有提到这一点。
我设法取消了NewWindow事件,该事件可以防止弹出窗口,因此已经解决了这个问题。

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

编辑

这不是IE的独立实例,而是Windows Form应用程序上的WebBrowser控件的实例。任何人对此控件或者基础控件AxSHDocVW有任何经验吗?

再次编辑

抱歉,我忘了提及这一点...我试图仅使用OK按钮来阻止JavaScript alert()。也许我可以转换为IHTMLDocument2对象并以这种方式访问​​脚本,我已经使用了MSHTML一点,有人知道吗?

解决方案

回答

我们是否要实施网络机器人?我在使用托管IE控件方面经验很少,但是我确实完成了一些尝试使用IE控件的Win32项目。禁用弹出窗口应该通过控件的事件处理程序完成,就像我已经做过的一样,但是我发现我们还需要在IE选项中更改"禁用脚本调试xxxx"(或者我们可以在代码中修改注册表),如下所示: cjheath已经指出。但是,我还发现,需要检查导航URL中是否有任何可下载的内容,以防止那些打开/保存对话框的出现,需要执行额外的步骤。但是我不知道如何处理流文件,因为我不能仅通过查看URL来跳过它们,最后我转向Indy库,省去了处理IE的所有麻烦。最后,我记得Microsoft确实在网上提到了IE并非旨在用作OLE控件的内容。根据我自己的经验,每次控件导航到新页面时,确实会引入程序的内存泄漏!

回答

这绝对是很棘手的,但是如果我们使用WebBrowser控件进行任何工作,就会发现自己在做很多棘手的事情。

这是我所知道的最简单的方法。我们需要注入JavaScript来覆盖警报功能...注入此JavaScript函数的过程类似:

window.alert = function () { }

有很多方法可以做到这一点,但这是很有可能的。一种可能性是挂钩DWebBrowserEvents2接口的实现。完成此操作后,我们可以将其插入NavigateComplete,DownloadComplete或者DocumentComplete(或者我们的一些变体)中,然后调用已实现的InjectJavaScript方法来执行对窗口的覆盖。方法。

就像我说的,hacky,但是它可以用:)

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

回答

我们可能需要自定义一些内容,查看" IDocHostUIHandler",然后查看其他一些相关的接口。我们甚至可以自定义对话框显示/ ui(我不记得是哪个界面执行此操作)的程度,我们可以进行很多控制。我很确定我们可以做我们想做的事,但这确实需要在MSHTML内部进行修改,并能够实现各种COM接口。

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

IHostDialogHelper
IDocHostShowUI

这些可能就是我们要实现的东西。

回答

为了方便地注入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);
}

回答

我刚刚在Code Project上发表了一篇文章,可能会对我们有所帮助。

请参阅http://www.codeproject.com/KB/shell/WebBrowserControlDialogs.aspx

希望这可以帮助。

回答

我通过创建扩展的WebBroswer类并覆盖OnNavigated方法设法注入了上面的代码。
这似乎工作得很好:

class WebBrowserEx : WebBrowser
{
  public WebBrowserEx ()
  {
  }

  protected override void OnNavigated( WebBrowserNavigatedEventArgs e )
  {
       HtmlElement he = this.Document.GetElementsByTagName( "head" )[0];
       HtmlElement se = this.Document.CreateElement( "script" );
       mshtml.IHTMLScriptElement element = (mshtml.IHTMLScriptElement)se.DomElement;
       string alertBlocker = "window.alert = function () { }";
       element.text = alertBlocker;
       he.AppendChild( se );
       base.OnNavigated( e );
  }
}