Ersetzen des .NET WebBrowser-Steuerelements durch einen besseren Browser wie Chrome?


432

Gibt es eine relativ einfache Möglichkeit, einen modernen Browser in eine .NET-Anwendung einzufügen?

Soweit ich weiß, ist das WebBrowserSteuerelement ein Wrapper für den IE , was kein Problem darstellen würde, außer dass es sich um eine sehr alte Version des IE handelt , mit allem, was mit CSS-Fehlern und potenziellen Sicherheitsrisiken verbunden ist (Wenn die Rendering-Engine nicht gepatcht wurde, kann ich dann wirklich damit rechnen, dass die zillion Pufferüberlaufprobleme behoben werden?) und andere Probleme.

Ich verwende Visual Studio C # (Express Edition - macht es hier einen Unterschied?)

Ich möchte einen guten Webbrowser in meine Anwendungen integrieren. In einigen Fällen verwende ich es nur, um den Benutzerregistrierungsprozess abzuwickeln, mit einigen Funktionen meiner Website und anderen Dingen dieser Reihenfolge zu kommunizieren, aber ich habe eine andere Anwendung im Sinn, die mehr Fehlerkontrolle erfordert.

Ich brauche:

  • Ein Browser, der in ein Fenster meiner Anwendung integriert werden kann (kein separates Fenster)
  • Eine gute Unterstützung für CSS, JS und andere Webtechnologien, die mit jedem modernen Browser vergleichbar ist
  • Grundlegende Browserfunktionen wie "navigieren", "zurück", "neu laden" ...
  • Liberaler Zugriff auf den Seitencode und die Ausgabe.

Ich habe über Chrome nachgedacht, da es unter die BSD-Lizenz fällt, aber ich wäre genauso zufrieden mit einer aktuellen Version von IE.

Ich möchte die Dinge so einfach wie möglich halten. Das Beste wäre, wenn man das vorhandene WebBrowserSteuerelement patchen könnte , das bereits ungefähr 70% meiner Anforderungen erfüllt, aber ich denke nicht, dass dies möglich ist.

Ich habe ein ActiveX-Steuerelement für Mozilla gefunden ( http://www.iol.ie/~locka/mozilla/control.htm ), aber es sieht aus wie eine alte Version, daher ist es nicht unbedingt eine Verbesserung.

Ich bin offen für Vorschläge


19
Warum verwendet das WebBrowser-Steuerelement eine alte Version des IE? Es verwendet die auf dem System des Benutzers installierte Version, obwohl der IE8-WebBrowser standardmäßig das IE7-Rendering zu verwenden scheint: blogs.msdn.com/ie/archive/2009/03/10/…
Tim Robinson

17
Weil es auf meinem Computer nicht so aussieht. Ich habe IE8 installiert, aber das Steuerelement zeigt Anzeigeprobleme an, die ich seit IE 5 nicht mehr gesehen habe. Ein sehr einfaches Anmeldeformular, 2 Felder mit einem Hauch von CSS haben eine verstümmelte Anzeige, und einige Javascript-Anzeigen funktionieren nicht, während sie angezeigt werden gut in IE8, Firefox, Chrome, Opera ... also nahm ich an, dass die Rendering-Engine eine alte war. Ich könnte völlig falsch liegen und vielleicht unterscheidet sich das Problem tatsächlich von dem, was ich dachte.
Sylverdrag

3
@ Sylverdrag: Du liegst falsch. Es verwendet den neuesten IE auf Ihrem System. Ich habe jedoch irgendwo gelesen, dass das WebBrowser-Steuerelement ein stärkeres Problem mit der Abwärtskompatibilität aufweist als der eigenständige Browser. IE8 kann beispielsweise ein Symbol zum Klicken haben, um den IE7-Modus zu aktivieren. Als Teil Ihres Programms ist dies nicht möglich, daher verwendet das Steuerelement aus Kompatibilitätsgründen standardmäßig den früheren Modus. OTOH, ich habe nicht gelesen, wie man es auf "IE8-Modus" einstellt.
John Saunders

55
Eigentlich, John Sanders, liegen Sie falsch. Es verwendet ie4 und Sie müssen einen Registrierungswert ändern, um anzuweisen, dass der aktuelle Wert verwendet werden soll. Suchen Sie nach "Feature-Modus-Emulation" und Sie erhalten Ihre Antworten, die kürzlich geändert wurden und das native Keyword enthalten, aber sie haben es geändert. Google die von mir erwähnten Keywords mit "Webbrowser-Steuerung" und Sie finden einen msdn-Artikel.
Erx_VB.NExT.Coder

8
Standardmäßig verwendet ein gehostetes WebBrowserSteuerelement die IE7-Emulation, sofern nicht anders angegeben FEATURE_BROWSER_EMULATION. Dies ist hier dokumentiert: blogs.msdn.com/b/askie/archive/2009/03/23/…
noseratio

Antworten:


171

Kasse CefSharp .Net- Bindungen, ein Projekt, das ich vor einiger Zeit gestartet habe und das dankenswerterweise von der Community aufgegriffen und in etwas Wunderbares verwandelt wurde.

Das Projekt umfasst das Chromium Embedded Framework und wurde in einer Reihe von Großprojekten verwendet, darunter der Windows-Client von Rdio, Facebook Messenger für Windows und Github für Windows.

Es verfügt über Browser-Steuerelemente für WPF und Winforms sowie über zahlreiche Funktionen und Erweiterungspunkte. Da es auf Chrom basiert, ist es auch unglaublich schnell.

Hol es dir bei NuGet: Install-Package CefSharp.WpfoderInstall-Package CefSharp.WinForms

Schauen Sie sich Beispiele an und geben Sie Ihre Gedanken / Rückmeldungen / Pull-Anfragen an: https://github.com/cefsharp/CefSharp

BSD lizenziert


2
Ich bin von OWS zu CEfSharp gewechselt, und ich kann mit Sicherheit sagen, dass es von sehr hoher Qualität und aktiver Community ist. Liebe es. github.com/cefsharp/CefSharp
Vin

1
CefSharp ist großartig, aber beachten Sie, dass die Bibliotheken sehr groß sind (mehr als 20 MB, als ich zuletzt nachgesehen habe), sodass sie möglicherweise nicht für ein leichteres Projekt geeignet sind.
Skyl3lazer

1
@ ANguyen ja du kannst
chillitom

1
Sehr, sehr glücklich zu wissen, dass Sie dieses Projekt gestartet haben! Kürzlich habe ich cefsharp verwendet, aber ich konnte sehen, dass die Bibliotheksgröße 80+ MB beträgt, was riesig ist, aber für das ordnungsgemäße Funktionieren (insbesondere reibungsloses Rendern) der Anwendung erforderlich ist. Gibt es eine Möglichkeit, dies zu reduzieren?
Aditya Bokade

5
Das hat mein Projekt gebrochen. Alle Referenzen sind nach der Installation des Winforms Nuget-Pakets fehlerhaft.
Toddmo

84

Chrome verwendet (eine Abzweigung von) Webkit, wenn Sie es nicht wussten, das auch von Safari verwendet wird. Hier sind einige Fragen, die der gleichen Art sind:

Das Webkit ist nicht großartig, wie die andere Antwort besagt, eine Version funktioniert nicht mehr (die Google Code One) und die Mono Version ist experimentell. Es wäre schön, wenn sich jemand die Mühe machen würde, einen anständigen .NET-Wrapper dafür zu erstellen, aber das scheint niemand zu wollen - was überraschend ist, da es jetzt HTML5 und so viele andere Funktionen unterstützt, dass der IE (8) ) Motor fehlt.

Update (2014)

Es gibt ein neues Projekt mit zwei Lizenzen, mit dem Sie Chrome in Ihre .NET-Anwendungen einbetten können Awesomium einbetten können . Es wird mit einer .NET-API geliefert, erfordert jedoch einige Hacks zum Rendern (die Beispiele zeichnen das Browserfenster in einen Puffer, malen den Puffer als Bild und aktualisieren auf einem Timer).

Ich denke, dies ist der Browser, der von Origin in Battlefield 3 verwendet wird.

Update (2016)

Es gibt jetzt DotnetBrowser , eine kommerzielle Alternative zu Awesomium. Es basiert auf Chrom.


Vielen Dank. Ich werde mir den Gecko-Wrapper ansehen. In der ursprünglichen Antwort heißt es jedoch: "Sie müssen lediglich das Mozilla ActiveX-Steuerelement registrieren", und ich dachte, dass die Express-Editionen keine zusätzlichen Steuerelemente registrieren können. Vermisse ich etwas Offensichtliches?
Sylverdrag

4
@ Syl Die Express-Editionen können so viele Steuerelemente registrieren, wie Sie benötigen. Sie können keine Plugins in Visual Studio installieren.
Joel Coehoorn

1
Ich habe ziemlich schlechte Erfahrungen mit der Verwendung von WebKit mit C # gemacht und musste mich schließlich für die Standard-Webbrowser-Komponente entscheiden, die mit .NET
Sumit Ghosh

1
Ab diesem Datum sind die oben genannten Projekte kein praktikabler Ersatz. Compilerfehler in Hülle und Fülle + Instabilität. Awesomium ist kompletter und völliger Müll.
Kraang Prime

"Ich denke, dies ist der Browser, der von Origin in Battlefield 3 verwendet wird." Das ist falsch. Ich weiß das, weil ich diese App zwingen musste, dh unter Windows 10, weil es nicht funktionierte, wenn es standardmäßig Edge war. Dies war vor einiger Zeit möglicherweise ein gelöstes Problem.
Theyouthis

64

Ich habe seit einigen Tagen Alternativen zur C # -Browser-Komponente getestet und hier ist meine Liste:

1. Verwenden neuerer IE-Versionen 8,9:

Webbrowser-Komponente ist IE7 nicht IE8? Wie kann man das ändern?

Vorteile:

  • Es ist nicht viel Arbeit erforderlich, um es zum Laufen zu bringen
  • Einige HTML5 / CSS3-Unterstützung, wenn IE9, voll, wenn IE10

Nachteile:

  • Auf dem Zielcomputer muss die Ziel-IE-Version installiert sein. IE10 befindet sich unter Win7 noch in der Vorschau

Dies erfordert nicht viel Arbeit und Sie können HTML5- und CSS3-Unterstützung erhalten, obwohl IE9 einige der besten CSS3- und HTML5-Funktionen nicht bietet. Aber ich bin sicher, Sie könnten IE10 auf die gleiche Weise zum Laufen bringen. Das Problem wäre, dass auf dem Zielsystem IE10 installiert sein müsste, und da sich Windows 7 noch in der Vorschau befindet, würde ich dagegen vorschlagen.

2. OpenWebKitSharp

OpenWebKitSharp ist ein .net-Wrapper für die Webkit-Engine, der auf dem WebKit.NET 0.5-Projekt basiert. WebKit ist eine Layout-Engine, die von Chrome / Safari verwendet wird

Vorteile:

  • Aktiv entwickelt
  • HTML5 / CSS3-Unterstützung

Nachteile:

  • Viele Funktionen nicht implementiert
  • Unterstützt x64 nicht (App muss für x86 erstellt werden)

OpenWebKit ist ganz nett, obwohl viele Funktionen noch nicht implementiert sind. Ich hatte nur wenige Probleme mit Visual Studio, das hier eine Null-Objektreferenz auslöst, und dann gibt es im Entwurfsmodus einige Probleme. Jeder, der es benutzt, wird fast sofort bemerken, dass js alert nichts tut. Ereignisse wie Mouseup, Mousedown ... usw. funktionieren nicht, Drag & Drop ist fehlerhaft und so weiter.

Ich hatte auch einige Probleme bei der Installation, da eine bestimmte Version von VC Redistributable installiert werden muss. Nach einer Ausnahme habe ich mir das Ereignisprotokoll angesehen, die Version von VC gefunden und installiert.

3. GeckoFX

Vorteile:

  • Funktioniert auf Mono
  • Aktiv entwickelt
  • HTML5 / CSS3-Unterstützung

Nachteile:

  • D̶o̶e̶s̶n̶'̶t̶ ̶s̶u̶p̶p̶o̶r̶t̶ ̶x̶6̶4̶ ̶ (

GeckoFX ist ein plattformübergreifendes Webrowser-Steuerelement zum Einbetten in WinForms-Anwendungen. Dies kann mit .NET unter Windows und mit Mono unter Linux verwendet werden. Gecko ist eine Layout-Engine, die von Firefox verwendet wird.

Ich bin auf wenige Informationen gestoßen, dass GeckoFX nicht aktiv entwickelt wurde, was nicht stimmt. Natürlich sind es immer eine oder zwei Versionen hinter Firefox, aber das ist normal. Ich war wirklich beeindruckt von der Aktivität und der Steuerung selbst. Es macht alles, was ich brauchte, aber ich brauchte etwas Zeit, um es zum Laufen zu bringen. Hier ist ein kleines Tutorial, um es zum Laufen zu bringen:

  1. Laden Sie GeckoFx-Windows-16.0-0.2 herunter . Hier können Sie überprüfen, ob neueres GeckoFX verfügbar ist
  2. Fügen Sie Verweise auf zwei heruntergeladene DLLs hinzu
  3. Da GeckoFX ein Wrapper ist, benötigen Sie XulRunner. Wechseln Sie zur Versionsliste zu sehen, welchen Sie benötigen
  4. Nachdem wir nun wissen, welche Version von XulRunner wir benötigen, gehen wir zu Mozilla XulRunner-Versionen , gehen zum Versionsordner -> Laufzeiten -> xulrunner- (your_version) .en-US.win32.zip, in unserem Fall xulrunner-16.0.en- US.win32.zip
  5. Entpacken Sie alles und kopieren Sie alle Dateien in Ihr bin \ Debug (oder geben Sie es frei, wenn Ihr Projekt auf Release eingestellt ist).
  6. Gehen Sie zum Visual Studio Designer Ihres Formulars, gehen Sie zur Toolbox, klicken Sie mit der rechten Maustaste hinein -> Elemente auswählen -> Durchsuchen -> Heruntergeladene GeckoFX-Winforms-DLL-Datei suchen -> OK
  7. Jetzt sollten Sie ein neues Steuerelement GeckoWebBrowser haben

Wenn Sie Chrome wirklich verwenden müssen, schauen Sie sich dieses Produkt namens Awesomium an . Es ist kostenlos für nichtkommerzielle Projekte, aber die Lizenz für kommerzielle Projekte beträgt einige tausend Dollar.


4
Sehr gute Beschreibung, wie GeckoFx zum Laufen gebracht wird. +1
Alex Essilfie

Beim Erstellen von Geckofx-Winforms benötigte ich 4 gtk # -Bibliotheken (atk-scharf, gdk-scharf, glib-scharf und gtk-scharf), daher musste ich zuerst Mono installieren.
Bernhardrusch

Diese Antwort ist spektakulär.
Mike Cole

Eine großartige Analyse. Ich wollte wissen, ob Sie Awesomium mit C # -Anwendungen getestet haben . Haben Sie dazu etwas zu sagen? Ich habe es noch nicht getestet, aber es scheint mir zuverlässig zu sein, nachdem ich mir das Kuratorium angesehen habe, das sie auf ihrer Seite erwähnt haben.
Abdul Rehman

2
@Wayne Wenn Sie es richtig machen möchten, sollten Sie einen Ordner in Ihrem Projekt oder einem separaten Projekt erstellen, in dem Sie alle Dateien, Gecko-FX-DLLs und XUL-Runner-Dateien einschließen und so einstellen, dass sie immer kopiert werden, und dann bei jeder Build-Aktion, die sie erhalten In Ihren Build / Debug-Ordner kopiert oder veröffentlicht, wenn Sie von VS aus veröffentlichen, gibt es auch die Xpcom.Initialize-Methode, die Sie aufrufen sollten, und Sie können den Pfad für die Xul-Runner-Dateien übergeben. Ich hoffe, das hilft
formatc

41

Ich hatte das gleiche Problem, der WebBrowser verwendete eine alte Version des IE. Beim Googeln stieß ich auf den folgenden Code, der eine Änderung in der Registrierung vornimmt und den WebBrowser dazu veranlasst, die aktuellste IE-Version zu verwenden:

 public enum BrowserEmulationVersion
    {
        Default = 0,
        Version7 = 7000,
        Version8 = 8000,
        Version8Standards = 8888,
        Version9 = 9000,
        Version9Standards = 9999,
        Version10 = 10000,
        Version10Standards = 10001,
        Version11 = 11000,
        Version11Edge = 11001
    }
    public static class WBEmulator
    {
        private const string InternetExplorerRootKey = @"Software\Microsoft\Internet Explorer";

        public static int GetInternetExplorerMajorVersion()
        {
            int result;

            result = 0;

            try
            {
                RegistryKey key;

                key = Registry.LocalMachine.OpenSubKey(InternetExplorerRootKey);

                if (key != null)
                {
                    object value;

                    value = key.GetValue("svcVersion", null) ?? key.GetValue("Version", null);

                    if (value != null)
                    {
                        string version;
                        int separator;

                        version = value.ToString();
                        separator = version.IndexOf('.');
                        if (separator != -1)
                        {
                            int.TryParse(version.Substring(0, separator), out result);
                        }
                    }
                }
            }
            catch (SecurityException)
            {
                // The user does not have the permissions required to read from the registry key.
            }
            catch (UnauthorizedAccessException)
            {
                // The user does not have the necessary registry rights.
            }

            return result;
        }
        private const string BrowserEmulationKey = InternetExplorerRootKey + @"\Main\FeatureControl\FEATURE_BROWSER_EMULATION";

        public static BrowserEmulationVersion GetBrowserEmulationVersion()
        {
            BrowserEmulationVersion result;

            result = BrowserEmulationVersion.Default;

            try
            {
                RegistryKey key;

                key = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true);
                if (key != null)
                {
                    string programName;
                    object value;

                    programName = Path.GetFileName(Environment.GetCommandLineArgs()[0]);
                    value = key.GetValue(programName, null);

                    if (value != null)
                    {
                        result = (BrowserEmulationVersion)Convert.ToInt32(value);
                    }
                }
            }
            catch (SecurityException)
            {
                // The user does not have the permissions required to read from the registry key.
            }
            catch (UnauthorizedAccessException)
            {
                // The user does not have the necessary registry rights.
            }

            return result;
        }
        public static bool SetBrowserEmulationVersion(BrowserEmulationVersion browserEmulationVersion)
        {
            bool result;

            result = false;

            try
            {
                RegistryKey key;

                key = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true);

                if (key != null)
                {
                    string programName;

                    programName = Path.GetFileName(Environment.GetCommandLineArgs()[0]);

                    if (browserEmulationVersion != BrowserEmulationVersion.Default)
                    {
                        // if it's a valid value, update or create the value
                        key.SetValue(programName, (int)browserEmulationVersion, RegistryValueKind.DWord);
                    }
                    else
                    {
                        // otherwise, remove the existing value
                        key.DeleteValue(programName, false);
                    }

                    result = true;
                }
            }
            catch (SecurityException)
            {
                // The user does not have the permissions required to read from the registry key.
            }
            catch (UnauthorizedAccessException)
            {
                // The user does not have the necessary registry rights.
            }

            return result;
        }

        public static bool SetBrowserEmulationVersion()
        {
            int ieVersion;
            BrowserEmulationVersion emulationCode;

            ieVersion = GetInternetExplorerMajorVersion();

            if (ieVersion >= 11)
            {
                emulationCode = BrowserEmulationVersion.Version11;
            }
            else
            {
                switch (ieVersion)
                {
                    case 10:
                        emulationCode = BrowserEmulationVersion.Version10;
                        break;
                    case 9:
                        emulationCode = BrowserEmulationVersion.Version9;
                        break;
                    case 8:
                        emulationCode = BrowserEmulationVersion.Version8;
                        break;
                    default:
                        emulationCode = BrowserEmulationVersion.Version7;
                        break;
                }
            }

            return SetBrowserEmulationVersion(emulationCode);
        }
        public static bool IsBrowserEmulationSet()
        {
            return GetBrowserEmulationVersion() != BrowserEmulationVersion.Default;
        }
    } 

Sie müssen nur eine Klasse erstellen und diesen Code einfügen und dann beim Starten des Programms den folgenden Code ausführen:

 if (!WBEmulator.IsBrowserEmulationSet())
            {
                WBEmulator.SetBrowserEmulationVersion();
            }

VB.NET:

Imports Microsoft.Win32
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Linq
Imports System.Security
Imports System.Text
Imports System.Threading.Tasks

Public Enum BrowserEmulationVersion
    [Default] = 0
    Version7 = 7000
    Version8 = 8000
    Version8Standards = 8888
    Version9 = 9000
    Version9Standards = 9999
    Version10 = 10000
    Version10Standards = 10001
    Version11 = 11000
    Version11Edge = 11001
End Enum


Public Class WBEmulator
    Private Const InternetExplorerRootKey As String = "Software\Microsoft\Internet Explorer"
    Public Shared Function GetInternetExplorerMajorVersion() As Integer

        Dim result As Integer

        result = 0

        Try
            Dim key As RegistryKey
            key = Registry.LocalMachine.OpenSubKey(InternetExplorerRootKey)
            If key IsNot Nothing Then
                Dim value As Object = If(key.GetValue("svcVersion", Nothing), key.GetValue("Version", Nothing))

                Dim Version As String
                Dim separator As Integer
                Version = value.ToString()
                separator = Version.IndexOf(".")
                If separator <> -1 Then
                    Integer.TryParse(Version.Substring(0, separator), result)
                End If
            End If

        Catch ex As SecurityException
            'The user does Not have the permissions required to read from the registry key.
        Catch ex As UnauthorizedAccessException
            'The user does Not have the necessary registry rights.
        Catch

        End Try
        GetInternetExplorerMajorVersion = result
    End Function
    Private Const BrowserEmulationKey = InternetExplorerRootKey + "\Main\FeatureControl\FEATURE_BROWSER_EMULATION"

    Public Shared Function GetBrowserEmulationVersion() As BrowserEmulationVersion

        Dim result As BrowserEmulationVersion
        result = BrowserEmulationVersion.Default

        Try
            Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, True)
            If key IsNot Nothing Then
                Dim programName As String
                Dim value As Object
                programName = Path.GetFileName(Environment.GetCommandLineArgs()(0))
                value = key.GetValue(programName, Nothing)
                If value IsNot Nothing Then
                    result = CType(Convert.ToInt32(value), BrowserEmulationVersion)
                End If
            End If
        Catch ex As SecurityException
            'The user does Not have the permissions required to read from the registry key.
        Catch ex As UnauthorizedAccessException
            'The user does Not have the necessary registry rights.
        Catch

        End Try

        GetBrowserEmulationVersion = result
    End Function
    Public Shared Function SetBrowserEmulationVersion(BEVersion As BrowserEmulationVersion) As Boolean

        Dim result As Boolean = False

        Try
            Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, True)
            If key IsNot Nothing Then
                Dim programName As String = Path.GetFileName(Environment.GetCommandLineArgs()(0))
                If BEVersion <> BrowserEmulationVersion.Default Then
                    'if it's a valid value, update or create the value
                    key.SetValue(programName, CType(BEVersion, Integer), RegistryValueKind.DWord)
                Else
                    'otherwise, remove the existing value
                    key.DeleteValue(programName, False)
                End If
                result = True
            End If
        Catch ex As SecurityException

            ' The user does Not have the permissions required to read from the registry key.

        Catch ex As UnauthorizedAccessException

            ' The user does Not have the necessary registry rights.

        End Try

        SetBrowserEmulationVersion = result
    End Function


    Public Shared Function SetBrowserEmulationVersion() As Boolean
        Dim ieVersion As Integer
        Dim emulationCode As BrowserEmulationVersion
        ieVersion = GetInternetExplorerMajorVersion()

        If ieVersion >= 11 Then

            emulationCode = BrowserEmulationVersion.Version11
        Else

            Select Case ieVersion
                Case 10
                    emulationCode = BrowserEmulationVersion.Version10
                Case 9
                    emulationCode = BrowserEmulationVersion.Version9
                Case 8
                    emulationCode = BrowserEmulationVersion.Version8
                Case Else
                    emulationCode = BrowserEmulationVersion.Version7
            End Select
        End If

        SetBrowserEmulationVersion = SetBrowserEmulationVersion(emulationCode)
    End Function

    Public Shared Function IsBrowserEmulationSet() As Boolean
        IsBrowserEmulationSet = GetBrowserEmulationVersion() <> BrowserEmulationVersion.Default
    End Function
End Class

Sie können es wie folgt verwenden:

If Not WBEmulator.IsBrowserEmulationSet() Then
    WBEmulator.SetBrowserEmulationVersion()
End If

1
Ausgezeichnet!! Ich danke dir sehr!
Ben

1
Übersetzt in Python (arbeitet an einer IronPython-Anwendung) und es hat perfekt funktioniert. Vielen Dank!
David

1
Das rettet mein Leben! Vielen Dank
Neeraj Dubey

1
Das ist fantastisch, aber ist es möglich, die Emulationsversion zurückzusetzen? Es scheint, dass die Version in einer WinForms-Anwendung nur einmal festgelegt werden kann. Es ist zwar möglich, dass es als zurückgesetzt erscheint, aber der Effekt ist, dass es nach dem Festlegen und Zurücksetzen in der Registrierung nicht mit neuen Registrierungswerten in einer WinForms-App erneut gelesen wird.
Cymorg

1
@ DarrenMB soweit ich weiß, verwendet es IE11
Ashkan Mobayen Khiabani

27

Sie können die Registrierung verwenden, um die IE-Version für die Webbrowser-Steuerung festzulegen. Gehen Sie zu: HKLM \ SOFTWARE \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION und fügen Sie "yourApplicationName.exe" mit dem Wert von browser_emulation hinzu. Den Wert von browser_emulation finden Sie unter folgendem Link: http://msdn.microsoft.com/en-us /library/ee330730%28VS.85%29.aspx#browser_emulation


10
Und wenn Sie in Visual Studio debuggen, müssen Sie wahrscheinlich "yourApplicationName.vshost.exe"
newenglander

3
Wenn Sie in Visual Studio debuggen, können Sie wahrscheinlich auf der Registerkarte Debuggen Ihrer Projekteigenschaften einfach das Kontrollkästchen "Visual Studio-Hosting-Prozess aktivieren" deaktivieren. Dann können Sie Ihren Exe-Namen ohne "vshost" -Teil verwenden.
Daniel Vygolov

1
@golavietnam Kannst du mir bitte dabei helfen? Ich habe deine Anweisungen ausprobiert und die Anweisungen auf dem von dir angegebenen Link verwendet, aber es funktioniert immer noch nicht. Wenn ich WhatIsMyBrowser.com mit dem Webbrowser-Steuerelement besuche, wird mir mitgeteilt, dass ich ie11 ABER im ie 7- Kompatibilitätsmodus verwende, und viele Websites lehnen die Arbeit ab und geben die Meldung "Bitte aktualisieren Sie Ihren Browser" aus. Wie kann ich die Webbrowser-Steuerung zwingen, die neueste Version von dh zu verwenden, dh die auf diese Weise installierte Version (dh 11) funktioniert nicht? Ich habe es hundert Mal versucht.
jay_t55

Vielen Dank, es hat funktioniert und meinen Tag gerettet
Tấn Nguyên

18

Schauen Sie sich das Mono.WebBrowser- Steuerelement an - es bettet entweder Gecko (wie von Firefox verwendet) oder WebKit (wie von Safari verwendet) in WinForms (ohne ActiveX) ein.


16

Ich weiß, dass dies kein 'Ersatz'-WebBrowser-Steuerelement ist, aber ich hatte einige schreckliche Rendering-Probleme, als ich eine Seite zeigte, die BootStrap 3+ für Layout usw. verwendete, und dann fand ich einen Beitrag, der vorschlug, Folgendes zu verwenden. Anscheinend ist es spezifisch für den Internet Explorer und weist ihn an, die neueste Variante des Clientcomputers zum Rendern zu verwenden (daher wird IE7 nicht verwendet, da dies meiner Meinung nach Standard ist).

Also einfach gesagt:

<meta http-equiv="X-UA-Compatible" content="IE=Edge" />

irgendwo im Kopfteil Ihres Dokuments.

Wenn es natürlich nicht Ihr Dokument ist, hilft dies natürlich nicht weiter (obwohl ich es persönlich als Sicherheitslücke betrachte, wenn Sie Seiten lesen, die nicht von Ihnen selbst über das Webbrowser-Steuerelement erstellt wurden - warum nicht einfach einen Webbrowser verwenden!)

Viel Glück.


Wenn Sie möchten, dass dies auf einem PC mit IE7 funktioniert, legen Sie es nicht irgendwo ab <head>, sondern als erstes Kind von <head>. Wir haben eine Weile gebraucht, um das herauszufinden.
Sylvain

Entschuldigung, ich meinte IE8 nicht IE7 in meinem vorherigen Kommentar. Wenn Sie in IE8 das nicht <meta>als erstes untergeordnetes Element von platzieren <head>, wird es im Kompatibilitätsmodus und nicht im Edge-Modus ausgeführt.
Sylvain

Ich habe das Webbrowser-Plugin in einer Winform-App verwendet und dies war eine große Hilfe. Die Seite, auf die ich traf, verwendete jquery & anglejs, was erstickte, weil es dachte, der Browser sei IE7, obwohl ich IE10 installiert habe.
Kywillis

Diese Arbeit für mich! Sie können dies auch verwenden, um eine bestimmte Version des IE festzulegen, zum Beispiel: <meta http-equiv = "X-UA-kompatibel" content = "IE = 10" /> und der Browser funktioniert immer als 10 (natürlich benötigen Sie die gleiche Version oder höher installiert haben
freedeveloper

Dies ist perfekt für meinen Anwendungsfall. Ich möchte schönere HTML-formatierte Berichte anzeigen. Es gibt bereits viele CSS-Inhalte. Dies ist ein besserer Ansatz als das Einbetten von Chrome / Firefox.
MD Ruffy

13

Schauen Sie sich den DotNetBrowser an Bibliothek an. Es bietet Chromium-basierte WPF- und WinForms-Browsersteuerelemente, die sich ganz einfach in .NET-Anwendungen einbetten lassen. Es unterstützt alle modernen Webstandards einschließlich HTML5, CSS3 und JavaScript. Die gerenderte Seite sieht genauso aus wie in Google Chrome.

Die Bibliothek erbt die Multiprozessarchitektur von Chromium. Jede Webseite wird in einem separaten Chromium-Prozess gerendert, und die Anwendung funktioniert auch nach einem Absturz des Plugins oder einem anderen unerwarteten Fehler auf der Webseite weiter.

Hier sind einige andere nützliche Funktionen, die von DotNetBrowser bereitgestellt werden: Es ist möglich, Ladeereignisse abzuhören, Netzwerkaktivitäten zu verarbeiten, Proxys zu konfigurieren, Benutzeraktionen zu simulieren, mit Cookies zu arbeiten, auf DOM zuzugreifen und diese zu ändern, DOM-Ereignisse abzuhören und JavaScript aus .NET aufzurufen und umgekehrt: Verwenden Sie eine Webkamera und ein Mikrofon auf der Webseite, richten Sie eine WebRTC-basierte Kommunikation ein und vieles mehr .

Weitere Informationen finden Sie in der API-Referenz .

Das folgende Codefragment zeigt, wie Sie eine Browseransicht erstellen, in ein Formular einbetten und eine URL laden:

using System.Windows.Forms;
using DotNetBrowser;
using DotNetBrowser.WinForms;

namespace WinForms.DotNetBrowser
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            BrowserView browserView = new WinFormsBrowserView();
            Controls.Add((Control) browserView);
            browserView.Browser.LoadURL("http://www.youtube.com");
        }
    }
}

Sobald Sie das obige Beispiel ausgeführt haben, erhalten Sie die folgende Ausgabe:

Geben Sie hier die Bildbeschreibung ein

Die Bibliothek ist kommerziell. Kommerzielle Lizenzen enthalten Support-Pakete für verschiedene Teamgrößen. Es ist auch möglich, den Quellcode der Bibliothek zu erwerben.

Neben einer eigenen Seite ist die Komponente als NuGet-Paket und als VSIX-Paket im Visual Studio Marketplace verfügbar .


16
Hüten Sie sich vor dem hohen Preis dieses Produkts
jjxtra

3
Es ist kein Open Source, seine Lizenz ist nicht billiger.
Ashish-BeJovial

8

Ich habe eine Handvoll Webkit-Varianten ausprobiert, aber meiner Erfahrung nach geht nichts über die Fortschritte von OpenWebkitSharp . Ich liebe es, ich liebe es. HTML5- und CSS3-Ergebnisse sind so nah wie möglich an Google Chrome. Sehr schönes API und Eventing-Modell. Wenn Sie "nicht implementierte" APIs am wahrscheinlichsten finden, weil sie nicht in Webkit implementiert sind. Alles andere funktioniert super.

OpenWebKitSharp ist ein .net-Wrapper für die Webkit-Engine, der auf dem WebKit.NET 0.5-Projekt basiert. Es fügt der Version 0.5 mehr Funktionen hinzu und bietet mehr Methoden als dieser Build. OpenWebKitSharp unterstützt sowohl den Build für Kairo (0,5) als auch die nächtlichen Builds des Webkits (standardmäßig Nightly). In Version 1.5 Stable und mehr ist der nächtliche Build enthalten und wird nach dem Erstellen automatisch kopiert. In früheren Versionen geschieht dies mit dem Cairo-Build. OpenWebKitSharp unterstützt derzeit GTLite Navigator, einen schnellen, stabilen und flexiblen Webbrowser.


1
Vielen Dank. Das sieht nach einem tollen Fund aus!
Sylverdrag

Ihre Foren sind auch ziemlich aktiv und ich habe sehr schnelle Antworten auf meine Fragen bekommen. Jetzt benutze ich dies für alle meine Webbrowser-Steuerungsanforderungen
Vin

2
Ja, das alles macht man, man ruft ExecuteScript auf. Ich bin jedoch zu CefSharp gewechselt und kann Ihnen sagen, dass es mir viel besser gefällt als OWS
Vin

1
Ein weiteres ekelhaftes Durcheinander von Code, das für die Verwendung überhaupt nicht geeignet ist.
Kraang Prime

1
Vorsicht, Webkit kann keinen Proxy verwenden. Ich habe ein Problem damit
Skhurams

7

UPDATE 2018 MAI

Wenn Sie eine Anwendung für die Ausführung unter Windows 10 anstreben, können Sie den Edge-Browser jetzt mithilfe des Windows Community Toolkit in Ihre .net-Anwendung einbetten .

WPF Beispiel:

1) Installieren Sie das Windows Community Toolkit Nuget-Paket

Install-Package Microsoft.Toolkit.Win32.UI.Controls

2) XAML-Code

<Window
    x:Class="WebViewTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WPF="clr-namespace:Microsoft.Toolkit.Win32.UI.Controls.WPF;assembly=Microsoft.Toolkit.Win32.UI.Controls"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WebViewTest"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <Grid>
        <WPF:WebView x:Name="wvc" />
    </Grid>
</Window>

3) CS-Code:

public partial class MainWindow : Window
{
  public MainWindow()
  {
    InitializeComponent();

    // You can also use the Source property here or in the WPF designer
    wvc.Navigate(new Uri("https://www.microsoft.com"));
  }
}

WinForms Beispiel:

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();

    // You can also use the Source property here or in the designer
    webView1.Navigate(new Uri("https://www.microsoft.com"));
  }
}

Weitere Informationen finden Sie unter diesem Link .


Ich habe das Nuget-Paket installiert, aber es funktioniert nicht. Immer noch ty.
Deniz

6

Versuchen Sie es mit EO.WebBrowser . Es ist neu und basiert auf der neuesten Version des Chrome-Browsers. Das Beste daran ist, dass es alles in eine einzelne .NET-DLL packt, so dass es nicht nur sehr einfach zu verwenden und bereitzustellen ist, sondern dass dieselbe DLL sowohl 32-Bit- als auch 64-Bit-DLL unterstützt, da es sich um eine .NET-DLL handelt.


9
Bitte geben Sie in Zukunft an, dass es sich um ein kommerziell lizenziertes Produkt handelt und ob Sie mit dem Produkt verbunden sind oder nicht, siehe Vermeiden Sie offene Eigenwerbung in den FAQs.
Andy Brown

1
Nachdem ich wie ein Wahnsinniger nach JAHREN gesucht habe ---- ist dieses "kommerzielle" Steuerelement buchstäblich der EINZIGE funktionierende Ersatz für den Internet Explorer, mit dem ich mich nicht herumschlagen musste und der keinen meiner aktuellen Browser vermasselt hat die Einstellungen. - Wenn ich markiere, bin ich in keiner Weise mit EO verbunden. Ich bin sauer, dass all diese anderen Lösungen völliger Müll und völlige Zeitverschwendung sind.
Kraang Prime

@SanuelJackson GeckoFx funktioniert perfekt in meinem Unternehmen und hat keine Probleme mit den Browsereinstellungen verursacht
Wayne

@ Wayne - das ist schön für dich. Keines dieser offenen Projekte ist ein Drop-In-Ersatz, der erhebliche Änderungen erfordert, um als verwalteter Code zu funktionieren, insbesondere als Drop-In-Winforms-Steuerelement. Entweder fehlt ihnen die Funktionalität, die das IE-Steuerelement bietet, und / oder sie sind vollständig, da sie ständig abstürzen oder langsam sind - sie können hier nicht einmal alle Probleme auflisten. Vielleicht wird in einem weiteren Jahrzehnt, in dem das Internet keine Webbrowser mehr benötigt, etwas Lebensfähiges funktionieren.
Kraang Prime

@SanuelJackson Hmm, ich wünschte, was du gesagt hast, wäre wahr. Leider hatte keine der Alternativen (einschließlich GeckoFX) für mich keine Show-Stop-Fehler. Ich wünschte auch, ich hätte den hohen Preis für den Essential Objects-Browser vermeiden können. Aber es war das einzige, das für mich einwandfrei funktioniert hat.
Maiken Roskilde

5

Ich habe GeckoFX verwendet und es dient mir sehr gut. Es verwendet die Firefox-Engine. Die einzige Einschränkung, auf die ich jemals gestoßen bin, ist, dass das Ereignis "DocumentLoaded" einmal ausgegeben wird, bevor das Dokument tatsächlich vollständig geladen ist Bilder und Sachen werden geladen. Ich habe es behoben, indem ich das erste einfach ignoriert habe, und es hat bisher einwandfrei funktioniert.

Sie finden es hier: https://bitbucket.org/geckofx/

Wie die meisten anständigen Bibliotheken ist es Open Source.


2
Alle Firefox-basierten Komponenten, die funktionieren, werden mit der Installation von Firefox durch den Benutzer verschraubt. Glücklicherweise funktionieren die meisten dieser Lösungen überhaupt nicht, und wenn Sie Glück haben, bleiben Ihre Firefox-Einstellungen erhalten - nicht so glücklich, Sie verlieren alle Ihre Einstellungen und haben immer noch nichts Besseres als den IE als Drop-In.
Kraang Prime

1
Link ist tot und altmodisch. bitbucket.org/geckofx hat die aktuelle Version
Wayne

@Sanual Jackson - Ich habe GeckoFx jahrelang verwendet und hatte nie Probleme mit der Installation von Firefox durch den Benutzer - einschließlich meiner eigenen. Raten Sie nur?
PandaWood

3

MozNet ist ein .NET-Steuerelement, das zuvor auf dem mehr oder weniger verlassenen GeckoFX-Steuerelement basiert, sich jedoch in der vollständigen Entwicklung befindet und weit mehr Funktionen bietet, als GeckoFX mit einem Stick erschüttern kann. Sie finden es auf der Se7en Soft- Website.


1
GeckoFX wird aktiv entwickelt bei: bitbucket
Wayne


2

Update 2016:

Es gibt 3 zusätzliche Optionen, die ich vorschlagen kann:

1. BrowseEmAll.Cef

Eine .Net-Komponente, mit der die Chrome-Engine in Ihre .Net-Anwendung integriert werden kann. Basierend auf CefGlue, aber etwas schneller bei Updates auf die neueste Chrome-Version. Es gibt auch eine kommerzielle Support- Option, die für einige nützlich sein könnte. Natürlich ist die Komponente selbst Open Source .

2. BrowseEmAll.Gecko

Eine weitere .Net-Komponente, mit der die Firefox-Engine in Ihre .Net-Anwendung integriert werden kann. Dies basiert auf Geckofx , funktioniert jedoch im Gegensatz zur aktuellen Version von Geckofx mit einem normalen Release-Build von Firefox. Um Geckofx verwenden zu können, müssen Sie Firefox selbst erstellen. Wieder ist kommerzieller Support verfügbar, aber die Komponente selbst ist vollständig Open Source .

3. BrowseEmAll Core API

Benötigen Sie all die verschiedenen Browser in Ihrer .Net-Anwendung? Mit welcher BrowseEmAll Core-API können Sie Chrome, Firefox, Webkit und Internet Explorer in Ihre Anwendung integrieren. Dies ist jedoch ein kommerzielles Produkt. Seien Sie also gewarnt.

(Vollständige Offenlegung: Ich arbeite für diese Firma, also nimm alles, was ich sage, mit einem Körnchen Salz)


1

Wenn Sie nach einem netten IE-basierten Steuerelement suchen, lesen Sie Folgendes: http://code.google.com/p/csexwb2/

Ich habe es in Produktionsprodukten verwendet. Es ist ziemlich gut und hat gute Demos, obwohl es nicht mehr so ​​gut gepflegt zu werden scheint wie früher.


1

Geckofx und Webkit.net waren anfangs beide vielversprechend, aber sie haben sich mit Firefox und Chrome nicht auf dem neuesten Stand gehalten, während sich der Internet Explorer verbessert hat, ebenso wie das Webbrowser-Steuerelement, obwohl es sich standardmäßig wie IE7 verhält, unabhängig davon, welche IE-Version Sie verwenden Haben, aber das kann behoben werden, indem Sie in die Registrierung gehen und es in IE9 ändern und HTML5 zulassen.




0

Ich habe alle Browser ausprobiert, die es gibt. Leider war EO.Browser der einzige, der unter allen Umständen wirklich für mich funktioniert hat. Ich wünschte, ich hätte eine kostenlose Lösung wählen können, aber am Ende hatte ich EO.Browser. Es ist ziemlich teuer, aber gut gepflegt.


0

Update 2016:

Für mich ist EO.WebBrowser die einzige zuverlässige und gewartete Browser-Alternative zum IE. Ich habe Tage und Wochen damit verbracht, die anderen auszuprobieren. Alle hatten einige Probleme, die die Show für mich irgendwann stoppten.


1
Nun ... ich habe eine Woche lang herumgespielt? versuchen, MS WebBrowser zum Laufen zu bringen - alles ohne Erfolg. Ich habe keinen der anderen ausprobiert =: - {außer EO.WebBrowser, der zum ersten Mal für mich funktioniert hat. Also seine 20 Minuten mit EO und Erfolg im Vergleich zu 5 Tagen mit MS und vollständigem und völlig schändlichem Versagen. Jetzt muss ich nur noch die 750 Dollar finden, um 'Erfolg' zu kaufen !!!
Richard Hammond

0

Ein Blick auf ein kommerzielles Produkt wie WebKitX lohnt sich hier: https://www.webkitx.com

Geben Sie hier die Bildbeschreibung ein

Es verwendet Chromium Embedded Framework und rendert HTML5, WebGL, PDF und Flash unter Windows XP, 7, 8, 10. Es bietet auch 32-Bit- und 64-Bit-Varianten des Steuerelements.

Es bietet DOM-Zugriff über COM-Objekte ähnlich dem IE WebBrowser-Steuerelement:

Geben Sie hier die Bildbeschreibung ein

Sie können JavaScript über den Funktionsnamen aufrufen, indem Sie skalare Argumente übergeben (ohne eval), und es gibt auch JavaScript-Rückrufe für Angular :

Geben Sie hier die Bildbeschreibung ein

Sie können JavaScript Ihre eigenen interoperablen COM-Objekte hinzufügen:

Geben Sie hier die Bildbeschreibung ein

Es unterstützt WebGL / WebAudio für HTML5-Spiele, die Sie für Citrix-Umgebungen deaktivieren können:

Geben Sie hier die Bildbeschreibung ein


Ich benutze es in der Produktion und vertraue ihm voll und ganz. Ich habe viele andere ausprobiert und bin mit diesem Browser festgefahren. Die Entwickler sind wirklich gut und "persönlich". Ich fühlte mich nicht allein wie mit vielen anderen. Wirklich gutes und stabiles Produkt.
mächtige

SO erfordert Haftungsausschlüsse, daher wäre es für Elias schön gewesen, darauf hinzuweisen, dass er der CTO von mobilefx ist, die die Entwickler von WebkitX
hko
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.