Frage

Ich habe ein .net 2.0 Webbrowser -Steuerung zum Navigieren einige Seiten ohne Benutzerinteraktion (nicht fragen ... lange Geschichte). Aufgrund der benutzerlosen Natur dieser Anwendung habe ich die ScripterRors-supprimierte Eigenschaft des Webbrowser-Steuerelements auf true eingestellt, die die in vs 2005-Staaten enthaltenen Dokumentation [...] alle ihre Dialogfelder verbergen wird, die aus dem zugrunde liegenden ActiveX-Steuerelement stammen, stammen aus. Nicht nur Skriptfehler. " Das MSDN -Artikel Erwähnt dies jedoch nicht. Ich habe es geschafft, das NewWindow -Event abzusagen, das Popups verhindert.

Jeder hat Erfahrung mit einem dieser und erfolgreich blockieren alle Dialoge, Skriptfehler usw.?

BEARBEITEN

Dies ist keine eigenständige Instanz des IE, sondern eine Instanz einer Webbrowser -Steuerung, die auf einer Windows -Formulationsanwendung lebt. Jeder hat Erfahrung mit dieser oder der zugrunde liegenden Kontrolle, Axshdocvw?

Wieder bearbeiten

Entschuldigung, ich habe vergessen, dies zu erwähnen ... ich versuche a zu blockieren JavaScript alert (), mit nur einer OK -Taste. Vielleicht kann ich in ein IHTMLDoCument2 -Objekt einfließen und auf diese Weise auf die Skripte zugreifen. Ich habe MSHTML ein wenig verwendet, weiß jemand?

War es hilfreich?

Lösung

Das ist definitiv hacky, aber wenn Sie mit der Webbrowser -Steuerung arbeiten, werden Sie viele hackige Sachen machen.

Dies ist der einfachste Weg, den ich kenne, um dies zu tun. Sie müssen JavaScript injizieren, um die Warnungsfunktion zu überschreiben ... etwas in den Zeilen der Injektion dieser JavaScript -Funktion:

window.alert = function () { }

Es gibt viele Möglichkeiten, dies zu tun, aber es ist sehr möglich. Eine Möglichkeit besteht darin, eine Implementierung des Dwebbrowserevents2 Schnittstelle. Sobald dies erledigt ist, können Sie dann in die NavigateComplete, den DownloadComplete oder das documentComplete (oder, wie wir, eine gewisse Variation davon) und dann eine InjectjavaScript -Methode, die Sie implementiert haben, diese Überschreibung des Fensters durchführen.Arert aufrufen. Methode.

Wie ich schon sagte, Hacky, aber es funktioniert :)

Ich kann auf weitere Details eingehen, wenn ich muss.

Andere Tipps

Und für eine einfache Möglichkeit, diese magische Linie von JavaScript zu injizieren, lesen Sie wie man JavaScript in das Webbrowser -Steuerelement einfließt.

Oder verwenden Sie einfach diesen vollständigen Code:

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

Möglicherweise müssen Sie einige Dinge anpassen, einen Blick darauf werfen IDocHostUIHandler, und sehen Sie sich dann einige der anderen verwandten Schnittstellen an. Sie können eine angemessene Menge an Kontrolle haben, selbst bis zum Anpassen des Dialogfelds/der Benutzeroberfläche (ich kann mich nicht erinnern, welche Schnittstelle dies tut). Ich bin mir ziemlich sicher, dass Sie das tun können, was Sie wollen, aber es erfordert, wenn Sie in den Interna von herumhauen MSHTML und in der Lage zu sein, die verschiedenen implementieren zu können COM Schnittstellen.

Einige andere Ideen:http://msdn.microsoft.com/en-us/library/aa770041.aspx

IHostDialogHelper
IDocHostShowUI

Dies können die Dinge sein, die Sie implementieren möchten.

Kugelsicherer Alarmblocker:

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

Diese Probe geht davon aus, dass Sie haben Microsoft.mshtml Referenz hinzugefügt ","mit MSHTML;"In Ihren Namespaces und Browser ist dein Webbrowser Beispiel.

Warum ist es kugelsicher? Erstens, es verarbeitet Skripte in Frames. Dann es stürzt nicht ab wenn ein besonderes "Killerrahmen" existiert im Dokument. EIN "Killerrahmen" ist ein Rahmen, der eine Ausnahme beim Versuch, es als HTMLWindow -Objekt zu verwenden, aufwirft. Alle auf document.window.frames verwendeten "foreach" würden eine Ausnahme verursachen, also sicherer "für" Schleife muss mit Try / Catch -Block verwendet werden.

Vielleicht ist es nicht das lesbarste Code, aber es funktioniert mit schlecht geformten Seiten im wirklichen Leben.

webBrowser1.ScriptErrorsSuppressed = true;

Fügen Sie das einfach Ihrer Einstiegsebene hinzu. Nach einer Vielzahl von Nachforschungen stieß ich auf diese Methode und berührte Wood bis jetzt. Prost!!

window.showmodelessDialog und window.showmodaldialog kann blockiert werden, indem die INEWWINDOWMANAGER -Schnittstelle implementiert wird. Zeigen Sie zusätzlich CODE CODEL Zeigen Sie an, wie Sie Warndialoge blockieren, indem Idochostshowui implementiert wird

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

Ich habe gerade einen Artikel über Codeprojekt veröffentlicht, der Ihnen helfen kann.

Bitte sehen Sie - - http://www.codeproject.com/kb/shell/webbrowsertroldialogs.aspx

Hoffe das hilft.

Das InjectAlertBlocker ist absolut korrekter Code ist

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

Referenzen mussten hinzugefügt werden, ist

  1. Fügen Sie einen Verweis auf MSHTML, was wahrscheinlich genannt wird "Microsoft HTML -Objektbibliothek" unter COM Verweise.

  2. Hinzufügen using mshtml; in Ihren Namespaces.

  3. Erhalten Sie einen Verweis auf das Skriptelement Ihres Skriptelements IHTMLElement:

Dann können Sie die verwenden Navigated Ereignis des Webbrowsers als:

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

Versuchen Sie, einen Webroboter zu implementieren? Ich habe wenig Erfahrung mit der Verwendung der gehosteten IE -Kontrolle, aber ich habe einige Win32 -Projekte abgeschlossen, die versucht haben, die IE -Kontrolle zu verwenden. Das Deaktivieren der Popups sollte über die Ereignishandler der Steuerung erfolgen, wie Sie es bereits getan haben CJheath wies bereits darauf hin. Ich stellte jedoch auch fest, dass zusätzliche Schritte zur Überprüfung der navigierenden URL nach herunterladbaren Inhalten durchgeführt werden mussten, um die Dialoge dieser Öffnen/Speichern zu verhindern. Aber ich weiß nicht, wie ich mit Streaming -Dateien umgehen soll, da ich sie nicht überspringen kann, indem ich mir die URLs alleine ansehe, und am Ende wandte ich mich an die Indy -Bibliothek, um mir alle Probleme beim Umgang mit IE zu retten. Schließlich erinnere ich mich, dass Microsoft online etwas erwähnt hat, dass IE nicht als OLE -Steuerung verwendet werden soll. Nach meiner eigenen Erfahrung hat das Steuerelement jedes Mal zu einer neuen Seite eingebracht, die für die Programme Speicherlecks eingeführt haben!

Ich hatte größere Probleme damit: Laden einer Webseite, die zum Drucken gedacht ist, und es zeigt einen nervigen Druckdialog an. Der InjectBlocker war der einzige Weg, der funktionierte, aber ziemlich unzuverlässig war. Unter bestimmten Bedingungen (ich denke, es ist zurückzuführen, dass die Webbrowser -Steuerung den IE Engine verwendet und dies von der installierten IE -Version abhängt) wird der Druckdialog immer noch angezeigt. Dies ist ein großes Problem, die Lösung funktioniert auf Win7 mit installiertem IE9, aber WinXP mit IE8 zeigt den Dialog an, egal was passiert.

Ich glaube, dass die Lösung darin besteht, den Quellcode zu ändern und das Print -JavaScript zu entfernen, bevor die Kontrolle die Seite rendert. Ich habe das jedoch versucht mit: DocumentText -Eigenschaft der Webbrowser -Steuerung und es funktioniert nicht. Die Eigenschaft ist nicht nur gelesen, hat aber keine Wirkung, wenn ich die Quelle ändere.

Die Lösung, die ich für mein Problem gefunden habe, ist das Exec -Skript:

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

Ich habe es geschafft, den obigen Code zu injizieren, indem ich ein erweitertes Erstellen erstellt habe WebBroswer Klasse und überschreiben die OnNavigated Methode.

Dies schien recht gut zu funktionieren:

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

Einfach aus den Browser -Steuerungseigenschaften: scripterrorSupression = true

Der einfachste Weg, dies zu tun, ist: In der: Webbrowser -Steuerung haben Sie die Prozedur (Standard). BeforeScriptExecute

(Der Parameter für BeforeScriptExecute ist pdispwindow )

Füge das hinzu :

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

Auf diese Weise wird vor einer Skriptausführung im Seitenfenster -Alarm durch injiziertes Code unterdrückt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top