我有一个.净 2.0 网页浏览器控制用来导航的一些网页没有用户相互作用(不要问...很长的故事).因为用户不自然的这个应用程序,我已经设置的网页浏览器控制的ScriptErrorsSuppressed财产真实的,该文件包括VS2005年国会[...]"隐藏其所有对话框产生的潜在的控件,不只是剧本中的错误。" 的 MSDN文章 没有提到这一点,但是。我已经取消的数字事件,其防止弹出式窗口,以便的照顾。

任何人有任何经验使用这些成功的阻挡 所有 对话、脚本的错误,等等?

编辑

这不是一个独立的实例,即,但实例的网页浏览器控制生活在一个窗户的形式应用程序。任何人有任何经验,与这种控制,或基础之一, AxSHDocVW?

再编辑

对不起我忘了提这个...我试图阻止一个 JavaScript警报(), 只有一个"确定"的按钮。也许我可以投入IHTMLDocument2对象和接的脚本,这种方式,我用MSHTML一点,任何人都知道吗?

有帮助吗?

解决方案

这是最绝对是哈克的,但是如果你做任何工作的网页浏览器的控制,你会发现自己做了很多哈克的东西。

这是最简单的方法,我知道这样做。你需要注入JavaScript复盖警报功能...沿线的东西注入这JavaScript功能:

window.alert = function () { }

还有 许多方法可以做到这一点, 但这是非常可以做到的。一种可能性是挂钩的一个执行情况 DWebBrowserEvents2 接口。一旦这样做了,然后你可以插入NavigateComplete,DownloadComplete,或DocumentComplete(或者如我们这样做,一些变体)和然后叫InjectJavaScript方法,你已经实现,执行这一压倒一切的窗口。警报方法。

就像我说的,哈克的,但它的工作原理:)

我可以进入更多细节,如果我需要的。

其他提示

和一个简单的方法注入那个魔术的线的javascript,阅读 如何注javascript成的网页浏览器控制.

或只是用这个完整的代号:

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);
}

你可能需要定制一些事,看一看 IDocHostUIHandler, 然后检查了一些其他相关的接口。你可以有一个公平的量的控制,甚至要点的定义对话显示/ui(我不记得其接口不会这)。我敢肯定你可以做你想做的,但它确实需要挖斗周围在内部 MSHTML 并且能够实现各种 COM 接口。

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

IHostDialogHelper
IDocHostShowUI

这些可能的东西你看到实施。

防弹警报拦截器:

Browser.Navigated +=
    new WebBrowserNavigatedEventHandler(
        (object sender, WebBrowserNavigatedEventArgs args) => {
            Action<HtmlDocument> 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;"在你的名称空间与 浏览器 是你的 网页浏览器 实例。

为什么是防弹的?第一, 把手脚本内框架.然后,它的 不会崩溃 当一个特殊的 "杀手架" 存在的文件。一个 "杀手架" 是一个框架,它提出了一个例外在试图利用它作为HtmlWindow对象。任何"foreach"上使用的文件。窗口。框架将导致一个例外,因此更安全的"for"循环必须使用具尝试/抓块。

也许这不是最可读的代码,但它的工作与现实生活中,虐待形成的网页。

webBrowser1.ScriptErrorsSuppressed = true;

只是添加到你的入门级的功能。之后,很多的研究是当我碰到这个方法,触摸木材,直到现在,其工作。干杯!

窗口。showModelessDialog和窗口。showModalDialog可以阻止通过实施INewWindowManager界面,另外的代码下面显示如何阻止警报的对话,通过实施IDocHostShowUI

public class MyBrowser : WebBrowser
{

    [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
    public MyBrowser()
    {
    }

    protected override WebBrowserSiteBase CreateWebBrowserSiteBase()
    {
        var manager = new NewWindowManagerWebBrowserSite(this);
        return manager;
    }

    protected class NewWindowManagerWebBrowserSite : WebBrowserSite, IServiceProvider, IDocHostShowUI
    {
        private readonly NewWindowManager _manager;

        public NewWindowManagerWebBrowserSite(WebBrowser host)
            : base(host)
        {
            _manager = new NewWindowManager();
        }

        public int ShowMessage(IntPtr hwnd, string lpstrText, string lpstrCaption, int dwType, string lpstrHelpFile, int dwHelpContext, out int lpResult)
        {
            lpResult = 0;
            return Constants.S_OK; //  S_OK Host displayed its UI. MSHTML does not display its message box.
        }

        // Only files of types .chm and .htm are supported as help files.
        public int ShowHelp(IntPtr hwnd, string pszHelpFile, uint uCommand, uint dwData, POINT ptMouse, object pDispatchObjectHit)
        {
            return Constants.S_OK; //  S_OK Host displayed its UI. MSHTML does not display its message box.
        }

        #region Implementation of IServiceProvider

        public int QueryService(ref Guid guidService, ref Guid riid, out IntPtr ppvObject)
        {
            if ((guidService == Constants.IID_INewWindowManager && riid == Constants.IID_INewWindowManager))
            {
                ppvObject = Marshal.GetComInterfaceForObject(_manager, typeof(INewWindowManager));
                if (ppvObject != IntPtr.Zero)
                {
                    return Constants.S_OK;
                }
            }
            ppvObject = IntPtr.Zero;
            return Constants.E_NOINTERFACE;
        }

        #endregion
    }
 }

[ComVisible(true)]
[Guid("01AFBFE2-CA97-4F72-A0BF-E157038E4118")]
public class NewWindowManager : INewWindowManager
{
    public int EvaluateNewWindow(string pszUrl, string pszName,
        string pszUrlContext, string pszFeatures, bool fReplace, uint dwFlags, uint dwUserActionTime)
    {

        // use E_FAIL to be the same as CoInternetSetFeatureEnabled with FEATURE_WEBOC_POPUPMANAGEMENT
        //int hr = MyBrowser.Constants.E_FAIL; 
        int hr = MyBrowser.Constants.S_FALSE; //Block
        //int hr = MyBrowser.Constants.S_OK; //Allow all
        return hr;
    }
}

我只是发表了一篇文章上项目代码,可以帮助你。

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

希望这会有所帮助。

InjectAlertBlocker 是绝对正确的 代码是

private void InjectAlertBlocker() {
    HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
    HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
    IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
    string alertBlocker = "window.alert = function () { }";
    element.text = alertBlocker;
    head.AppendChild(scriptEl);
}

参考文献需要加入

  1. 增加一个参考 MSHTML, ,这将probalby被称为"Microsoft HTML对象的图书馆"下 COM 参考文献。

  2. 添加 using mshtml; 你的名字空间。

  3. 得到一个参考你的脚本元素的 IHTMLElement:

然后你可以使用 Navigated 事件的网页浏览器为:

private void InjectAlertBlocker()
{
    HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
    HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
    IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
    string alertBlocker = "window.alert = function () { }";
    element.text = alertBlocker;
    head.AppendChild(scriptEl);
}

private void webDest_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
    InjectAlertBlocker();
}

你试图实现网的机器人吗?我有点经验中使用的主办即控制,但我没有完成的几个Win32项目试图利用即控制。禁用的弹出窗口应当通过对事件的处理程序的控制,因为你已经做了,但是我发现你还需要改变的'禁止本调试xxxx'在即选择(或者你可以修改的注册在你的代码)为cjheath已经指出。但是我还发现额外的步骤,需要做检查的航行url任何可下载的内容,以防止那些开放/省之间的对话。但我不知道如何处理与流的文件,因为我不能跳过他们通过查看的网址,独自并在结束时我向印地图书馆救了我所有的烦恼在处理IE。最后,我记得Microsoft没有提到网上的东西,即不是设计用来作为一个OLE控制。根据我自己的经验,每次控制导航到新的一页做了介绍存储器的泄漏的计划!

我有更大的问题:加载一个网页,目的是为印刷和它显示恼人的打印的对话。该InjectBlocker是唯一的方式运作,但相当不可靠的。在某些条件下(我正在考虑这是由于浏览器的控制即使用发动机,这取决于安装即版)的打印对话仍然出现。这是一个重大问题,解决方案的工作在windows7资与IE9安装,但WinXP与IE8显示的对话,无论什么。

我认为,解决的办法是在修改源码并且除去打印javascript、控制之前呈现的网页。然而我试图说:DocumentText酒店的网页浏览器控制以及它不工作。酒店是不是只读的,但它没有效果,当我修改的来源。

解决我找到我的问题是Exec脚本:

string alertBlocker = "window.print = function emptyMethod() { }; window.alert = function emptyMethod() { }; window.open = function emptyMethod() { };";    
this.Document.InvokeScript("execScript", new Object[] { alertBlocker, "JavaScript" });

我设法以注射代码上通过创造一种延伸 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 );
  }
}

简单地从浏览器控制性质:scriptErrorSupressed=true

最简单的方法来做到这一点是:在:网页浏览器控制你的程序(标准) BeforeScriptExecute

(参数 BeforeScriptExecutepdispwindow )

添加:

pdispwindow.execscript("window.alert = function () { }")

在这方之前任何脚本执行上的网页窗口提醒将会抑制通过注射代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top