Zastąpić kontrolę .NET WebBrowser lepszą przeglądarką, taką jak Chrome?

432

Czy jest jakiś stosunkowo łatwy sposób na wstawienie nowoczesnej przeglądarki do aplikacji .NET?

O ile rozumiem, WebBrowserkontrola jest opakowaniem dla IE , co nie stanowiłoby problemu, poza tym, że wygląda na to, że jest to bardzo stara wersja IE , ze wszystkim, co pociąga za sobą błędy w CSS, potencjalne zagrożenia bezpieczeństwa (jeśli silnik renderowania nie został załatany, czy naprawdę mogę oczekiwać, że problemy z przepełnieniem bufora zillion zostaną naprawione?) i inne problemy.

Korzystam z programu Visual Studio C # (edycja ekspresowa - czy ma to tutaj znaczenie?)

Chciałbym zintegrować dobrą aplikację internetową z moimi aplikacjami. W niektórych po prostu używam go do obsługi procesu rejestracji użytkownika, interfejsu z niektórymi funkcjami mojej witryny i innymi rzeczami tego zamówienia, ale mam na myśli inną aplikację, która będzie wymagała więcej kontroli ...

Potrzebuję:

  • Przeglądarka, którą można zintegrować w oknie mojej aplikacji (nie w osobnym oknie)
  • Dobre wsparcie dla CSS, js i innych technologii internetowych, na równi z każdą nowoczesną przeglądarką
  • Podstawowe funkcje przeglądarki, takie jak „nawiguj”, „wstecz”, „przeładuj” ...
  • Liberalny dostęp do kodu strony i wyników.

Myślałem o Chrome, ponieważ jest objęty licencją BSD, ale byłbym równie zadowolony z najnowszej wersji IE.

W miarę możliwości chciałbym, aby sprawy były proste. Najlepiej byłoby, gdyby można było załatać istniejącą WebBrowserkontrolę, która robi już około 70% tego, czego potrzebuję, ale nie sądzę, żeby to było możliwe.

Znalazłem formant ActiveX dla Mozilli ( http://www.iol.ie/~locka/mozilla/control.htm ), ale wygląda na to, że jest to stara wersja, więc niekoniecznie jest to poprawa.

Jestem otwarty na sugestie

Sylverdrag
źródło
19
Dlaczego mówisz, że formant WebBrowser używa starej wersji IE? Używa wersji zainstalowanej w systemie użytkownika, chociaż przeglądarka IE8 WebBrowser wydaje się domyślnie renderować IE7: blogs.msdn.com/ie/archive/2009/03/10/…
Tim Robinson
17
Ponieważ nie wygląda tak na moim komputerze. Mam zainstalowany IE8, ale formant pokazuje problemy z wyświetlaniem, których nie widziałem od IE 5. Bardzo prosty formularz logowania, 2 pola z odrobiną CSS mają zniekształcony wyświetlacz, a niektóre wyświetlanie javascript nie działa, podczas gdy wyświetla dobrze w IE8, Firefox, Chrome, Opera ... więc założyłem, że silnik renderujący jest stary. Mogę się całkowicie mylić w tej kwestii i być może problem w rzeczywistości różni się od tego, co myślałem.
Sylverdrag,
3
@Sylverdrag: Mylisz się. Używa najnowszej IE w twoim systemie. Jednak gdzieś czytałem, że kontrolka WebBrowser ma silniejszy problem z kompatybilnością wsteczną niż samodzielna przeglądarka. IE8 może mieć na przykład ikonę do kliknięcia, aby włączyć tryb IE7. W ramach programu nie jest to możliwe, dlatego domyślnym elementem sterującym jest wcześniejszy tryb zgodności. OTOH, nie przeczytałem, jak ustawić go do używania „trybu IE8”.
John Saunders
55
John Sanders, mylisz się. Używa ie4 i musisz zmienić wartość rejestru, aby kazała mu używać prądu. Spójrz na „emulację trybu funkcji”, a otrzymasz swoje odpowiedzi, ostatnio zmienione, używane w celu uwzględnienia słowa kluczowego natywnego, ale zmieniono je, google słowa kluczowe, o których wspomniałem z „kontrolą przeglądarki internetowej”, a znajdziesz artykuł msdn.
Erx_VB.NExT.Coder
8
Domyślnie WebBrowserkontrolka hostowana korzysta z emulacji IE7, chyba że zalecono inaczej FEATURE_BROWSER_EMULATION. Jest to udokumentowane tutaj: blogs.msdn.com/b/askie/archive/2009/03/23/…
noseratio

Odpowiedzi:

171

Checkout Wiązania CefSharp .Net , projekt, który rozpocząłem jakiś czas temu, który na szczęście został przyjęty przez społeczność i zamienił się w coś wspaniałego.

Projekt obejmuje Chromium Embedded Framework i był wykorzystywany w wielu dużych projektach, w tym w kliencie Rdio dla systemu Windows, Facebook Messenger dla Windows i Github dla Windows.

Zawiera kontrolki przeglądarki dla WPF i Winforms oraz mnóstwo funkcji i punktów rozszerzeń. Opierając się na Chromium, jest również niesamowicie szybki.

Weź go z NuGet: Install-Package CefSharp.WpflubInstall-Package CefSharp.WinForms

Sprawdź przykłady i podziel się swoimi przemyśleniami / opiniami / prośbami: https://github.com/cefsharp/CefSharp

BSD na licencji

chillitom
źródło
2
Przeszedłem na CEfSharp z OWS i mogę śmiało powiedzieć, że jest to bardzo aktywna społeczność o bardzo wysokiej jakości. Kocham to. github.com/cefsharp/CefSharp
Vin
1
CefSharp jest świetny, ale pamiętaj, że biblioteki są naprawdę duże (ponad 20 MB ostatnio wyglądałem), więc mogą nie być odpowiednie dla bardziej lekkiego projektu.
Skyl3lazer
1
@ANguyen tak, możesz
chillitom
1
Bardzo, bardzo szczęśliwy, wiedząc, że to Ty rozpocząłeś ten projekt! Ostatnio korzystałem z cefsharp, ale zauważyłem, że rozmiar biblioteki to ponad 80 MB, co jest ogromne, ale wymagane do poprawnego działania (szczególnie płynnego renderowania) aplikacji. Czy jest jakiś sposób na zmniejszenie tego?
Aditya Bokade
5
To zepsuło mój projekt. Wszystkie odniesienia zepsute po zainstalowaniu pakietu nuget winforms.
toddmo
84

Chrome nie używa (widelca) pakietu Webkit, jeśli jeszcze tego nie wiesz, z którego korzysta także Safari. Oto kilka pytań o tym samym charakterze:

Webkit nie jest świetny, jak mówi druga odpowiedź, jedna wersja nie działa (kod Google), a Mono jest eksperymentalna. Byłoby miło, gdyby ktoś dołożył starań, aby zrobić dla niego przyzwoite opakowanie .NET, ale wydaje się, że nikt nie chce tego robić - co jest zaskakujące, biorąc pod uwagę, że teraz obsługuje HTML5 i wiele innych funkcji, które IE (8) ) brakuje silnika.

Aktualizacja (2014)

Jest nowy podwójnie licencjonowany projekt, który pozwala osadzać Chrome w aplikacjach .NET o nazwie Awesomium . Jest wyposażony w interfejs API .NET, ale do renderowania wymaga sporo hacków (przykłady przyciągają okno przeglądarki do bufora, malują bufor jako obraz i odświeżają na zegarze).

Myślę, że jest to przeglądarka używana przez Origin w Battlefield 3.

Aktualizacja (2016)

Jest teraz DotnetBrowser , komercyjna alternatywa dla Awesomium. Opiera się na chromie.

Chris S.
źródło
Dzięki. Rzucę okiem na owijkę Gecko. Jedną rzeczą jest jednak, że oryginalna odpowiedź brzmi „Wszystko, co musisz zrobić, to zarejestrować formant ActiveX Mozilla” i myślałem, że wersje Express nie mogą zarejestrować dodatkowych formantów. Czy brakuje mi czegoś oczywistego?
Sylverdrag
4
@Syl Wydania ekspresowe mogą zarejestrować tyle elementów sterujących, ile potrzebujesz. To, czego nie zrobią, to pozwolenie na zainstalowanie wtyczek w Visual Studio.
Joel Coehoorn
1
Miałem dość złe doświadczenia z używaniem WebKit z C # i wreszcie musiałem zadowolić się domyślnym komponentem przeglądarki internetowej, który jest dostarczany z .NET
Sumit Ghosh
1
Na dzień dzisiejszy powyższe projekty nie są wykonalnymi zamiennikami. Błędy kompilatora mnóstwo + niestabilność. Awesomium to kompletne i kompletne śmieci.
Kraang Prime
„Myślę, że jest to przeglądarka używana przez Origin w Battlefield 3.” To jest niepoprawne. Wiem o tym, ponieważ musiałem zmusić tę aplikację do użycia, tj. W systemie Windows dziesięć, ponieważ gdy domyślnie korzystała z krawędzi, nie działała. To było jakiś czas temu, być może problem rozwiązany.
Theyouthis,
64

Testuję alternatywy dla komponentu przeglądarki C # od kilku dni i oto moja lista:

1. Korzystanie z nowszych wersji IE 8,9:

Komponent przeglądarki internetowej to IE7 nie IE8? Jak to zmienić?

Plusy:

  • Uruchomienie go nie wymaga wiele pracy
  • niektóre wsparcie HTML5 / CSS3, jeśli IE9, pełne, jeśli IE10

Cons:

  • Na komputerze docelowym musi być zainstalowana docelowa wersja IE, IE10 jest nadal w wersji zapoznawczej na Win7

Nie wymaga to wiele pracy i można uzyskać obsługę HTML5 i CSS3, chociaż IE9 nie ma niektórych najlepszych funkcji CSS3 i HTML5. Ale jestem pewien, że możesz uruchomić IE10 w ten sam sposób. Problem polegałby na tym, że system docelowy musiałby mieć zainstalowany IE10, a ponieważ wciąż jest dostępny podgląd w systemie Windows 7, odradzam to.

2. OpenWebKitSharp

OpenWebKitSharp to opakowanie .net dla silnika Webkit opartego na projekcie WebKit.NET 0.5. WebKit to silnik układu używany przez Chrome / Safari

Plusy:

  • Aktywnie rozwinięty
  • Obsługa HTML5 / CSS3

Cons:

  • Wiele funkcji nie zostało zaimplementowanych
  • Nie obsługuje x64 (aplikacja musi być zbudowana dla x86)

OpenWebKit jest całkiem fajny, chociaż wiele funkcji nie zostało jeszcze zaimplementowanych, miałem kilka problemów z używaniem go w Visual Studio, które rzuca odwołanie do zerowego obiektu tutaj, a następnie w trybie projektowania, są pewne problemy z js. Każdy, kto go użyje, niemal natychmiast zauważy, że js alert nic nie robi. Zdarzenia takie jak mouseup, mousedown ... itd. Nie działają, przeciąganie i upuszczanie js jest błędne i tak dalej

Miałem też pewne trudności z jego instalacją, ponieważ wymaga zainstalowanej konkretnej wersji redystrybucyjnej wersji VC, więc po wyjrzeniu przejrzałem dziennik zdarzeń, znalazłem wersję VC i zainstalowałem ją.

3. GeckoFX

Plusy:

  • Działa na mono
  • Aktywnie rozwinięty
  • Obsługa HTML5 / CSS3

Cons:

  • D̶o̶e̶s̶n̶'̶t̶ ̶s̶u̶p̶p̶o̶r̶t̶ ̶x̶6̶4̶ ̶ (̶A̶p̶p̶ ̶m̶u̶s̶t̶ ̶b̶e̶ ̶b̶u̶i̶l̶t̶ ̶f̶o̶r̶ ̶x̶8̶6̶) komentarze poniżej comments

GeckoFX to wieloplatformowy kontroler Webrowser do osadzania w aplikacjach WinForms. Można tego używać z .NET w systemie Windows i mono w systemie Linux. Gecko to silnik układu wykorzystywany przez Firefox.

Wpadłem na kilka informacji, że GeckoFX nie jest aktywnie rozwijany, co nie jest prawdą, oczywiście, że zawsze jest to jedna lub dwie wersje za Firefoksem, ale to normalne, byłem pod wrażeniem aktywności i samej kontroli. Robi wszystko, czego potrzebowałem, ale potrzebowałem trochę czasu, aby go uruchomić, oto mały samouczek, aby go uruchomić:

  1. Pobierz GeckoFx-Windows-16.0-0.2 , tutaj możesz sprawdzić, czy nowszy jest dostępny GeckoFX
  2. Dodaj odniesienia do dwóch pobranych bibliotek dll
  3. Ponieważ GeckoFX jest opakowaniem, potrzebujesz XulRunner, przejdź do Listy wersji, aby zobaczyć, którego potrzebujesz
  4. Teraz, gdy wiemy, której wersji XulRunner potrzebujemy, przechodzimy do wydań Mozilla XulRunner , przechodzimy do folderu wersji -> środowiska wykonawcze -> xulrunner- (twoja_wersja) .en-US.win32.zip, w naszym przypadku xulrunner-16.0.en- US.win32.zip
  5. Rozpakuj wszystko i skopiuj wszystkie pliki do bin \ Debug (lub zwolnij, jeśli projekt ma zostać wydany)
  6. Przejdź do projektanta wizualnego swojego formularza, przejdź do przybornika, kliknij prawym przyciskiem myszy w środku -> Wybierz elementy -> Przeglądaj -> Znajdź pobrany plik dll WinForm GeckoFX -> OK
  7. Teraz powinieneś mieć nową kontrolę GeckoWebBrowser

Jeśli naprawdę musisz korzystać z Chrome, spójrz na ten produkt o nazwie Awesomium , jest bezpłatny dla niekomercyjnych projektów, ale licencja kosztuje kilka tysięcy dolarów na komercyjne.

formatc
źródło
4
Bardzo dobry opis uruchomienia GeckoFx. +1
Alex Essilfie
podczas budowania Geckofx-Winforms potrzebowałem 4 bibliotek GTK # (atk-sharp, gdk-sharp, glib-sharp i gtk-sharp), więc najpierw musiałem zainstalować Mono.
bernhardrusch
Ta odpowiedź jest spektakularna.
Mike Cole
Rzeczywiście świetna analiza. Chciałem wiedzieć, czy zdarzyło Ci się przetestować Awesomium za pomocą aplikacji C #. Czy masz coś do powiedzenia na ten temat? Nie przetestowałem go jeszcze, ale wydaje mi się wiarygodny po obejrzeniu panelu powierników, o którym wspominali na swojej stronie.
Abdul Rehman
2
@Wayne, jeśli chcesz to zrobić dobrze, powinieneś utworzyć folder w swoim projekcie lub osobny projekt, w którym umieściłbyś wszystkie pliki, pliki dll Gecko i pliki Run Xul i ustawiał je tak, aby zawsze były kopiowane, a następnie przy każdej akcji kompilacji, którą otrzymywały skopiowane do folderu kompilacji / debugowania lub opublikowane, jeśli publikujesz z VS, istnieje również Xpcom. Zainicjuj metodę, którą powinieneś wywołać i możesz przekazać ścieżkę plików xul runner, mam nadzieję, że to pomoże
formatc
41

Miałem ten sam problem, WebBrowser używał starej wersji IE, z pewnym googlowaniem natrafiłem na następujący kod, który wprowadza zmianę w rejestrze i sprawia, że ​​WebBrowser może używać najnowszej możliwej wersji IE:

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

Wystarczy utworzyć klasę i umieścić w niej ten kod, a następnie uruchomić następujący kod podczas uruchamiania programu:

 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

Możesz go używać w następujący sposób:

If Not WBEmulator.IsBrowserEmulationSet() Then
    WBEmulator.SetBrowserEmulationVersion()
End If
Ashkan Mobayen Khiabani
źródło
1
Świetny!! Dziękuję bardzo!
Ben
1
Przetłumaczone na Python (działający na aplikacji IronPython) i działało idealnie. Dzięki!
David
1
To ratuje mi życie! Dzięki
Neeraj Dubey,
1
To fantastyczne, ale czy można zresetować wersję emulacji? Wygląda na to, że wersję można ustawić tylko raz w aplikacji WinForms. Chociaż możliwe jest, że wygląda na zresetowany, efekt jest taki, że po ustawieniu i zresetowaniu w rejestrze nie jest on ponownie odczytywany z nowymi wartościami rejestru w aplikacji WinForms.
cymorg
1
@DarrenMB, o ile wiem, używa IE11
Ashkan Mobayen Khiabani
27

Możesz użyć rejestru, aby ustawić wersję IE do sterowania przeglądarką. Przejdź do: HKLM \ SOFTWARE \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION i dodaj „yourApplicationName.exe” o wartości emulacji przeglądarki Aby zobaczyć wartość emulacji przeglądarki, zapoznaj się z linkiem: http://msdn.microsoft.com/en-us /library/ee330730%28VS.85%29.aspx#browser_emulation

Golaw Wietnam
źródło
10
A jeśli debugujesz w Visual Studio, prawdopodobnie będziesz musiał użyć „yourApplicationName.vshost.exe”
newenglander
3
A jeśli debugujesz w Visual Studio, prawdopodobnie możesz po prostu odznaczyć „Włącz proces hostowania Visual Studio” na karcie Debugowanie właściwości projektu. Następnie możesz użyć nazwy exe bez części „vshost”.
Daniel Vygolov
1
@golavietnam Czy możesz mi pomóc, wypróbowałem twoje instrukcje i korzystałem z instrukcji podanego linku, ale nadal nie działa. Kiedy odwiedzam WhatIsMyBrowser.com za pomocą kontrolki przeglądarki internetowej, mówi mi, że używam ie11 ALE w trybie zgodności z 7 , a wiele stron internetowych odmawia pracy i wyświetla komunikat „Proszę zaktualizować przeglądarkę”. Jak zmusić kontrolę przeglądarki do korzystania z najnowszej wersji tj. Zainstalowanej (tj. 11) w ten sposób nie działa, próbowałem już sto razy.
jay_t55
Dziękuję, zadziałało i uratowało mi dzień
T Nn Nguyên
18

Spójrz na kontrolkę Mono.WebBrowser - osadza w WinForms Gecko (używane przez Firefox) lub WebKit (używane przez Safari).

RichieHindle
źródło
16

Wiem, że to nie jest kontrolka „zastępująca” WebBrowser, ale miałem okropne problemy z renderowaniem podczas wyświetlania strony, która używała BootStrap 3+ do układania itp., A potem znalazłem post sugerujący użycie następujących. Najwyraźniej jest specyficzny dla IE i każe mu używać do renderowania najnowszej odmiany znalezionej na komputerze klienckim (więc nie będzie używać IE7, ponieważ uważam, że jest domyślny)

Więc po prostu:

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

gdzieś w głównej części dokumentu.

Jeśli oczywiście nie jest to twój dokument, to oczywiście nie pomoże (chociaż osobiście uważam to za lukę w zabezpieczeniach, jeśli czytasz strony, które nie zostały utworzone przez Ciebie za pomocą kontrolki przeglądarki internetowej - dlaczego nie po prostu użyć przeglądarki internetowej!)

Powodzenia.

UnimpressedCoder
źródło
Jeśli chcesz to do pracy na komputerze z systemem IE7, nie umieścić go gdzieś w <head>, umieścić go jako pierwszego dziecka <head>. Długo nam to zajęło.
Sylvain
Przepraszam, miałem na myśli IE8 nie IE7 w poprzednim komentarzu. Tak więc w IE8, jeśli nie umieścisz <meta>jako pierwszego elementu potomnego <head>, będzie działał w trybie zgodności, a nie w trybie krawędzi.
Sylvain
Korzystałem z wtyczki przeglądarki internetowej w aplikacji WinForm i to była ogromna pomoc. Strona, na którą wchodziłem, używała jquery & angularjs, która się dusiła, ponieważ myślała, że ​​przeglądarka to IE7, mimo że mam zainstalowany IE10.
Kywillis
To działa dla mnie! Możesz także użyć tego do ustawienia konkretnej wersji IE, na przykład: <meta http-equiv = "X-UA-Compatible" content = "IE = 10" /> i zawsze przeglądarka działa jako 10 (oczywiście potrzebujesz zainstalować tę samą wersję lub wyższą
freedeveloper
Jest to idealne rozwiązanie dla mojej skrzynki użytkownika. Chcę pokazać ładniejsze raporty w formacie HTML. Istnieje już wiele treści CSS. Jest to lepsze podejście niż osadzanie chrome / firefox.
MD Luffy,
13

Spójrz na DotNetBrowser bibliotekę . Zapewnia oparte na Chromium kontrolki przeglądarki WPF i WinForms, które można dość łatwo osadzić w aplikacji .NET. Obsługuje wszystkie nowoczesne standardy sieciowe, w tym HTML5, CSS3 i JavaScript. Renderowana strona wygląda dokładnie tak, jak w Google Chrome.

Biblioteka dziedziczy architekturę wieloprocesową Chromium - każda strona internetowa jest renderowana w osobnym procesie Chromium, a aplikacja będzie działać nawet po awarii wtyczki lub innym nieoczekiwanym błędzie na stronie internetowej.

Oto kilka innych przydatnych funkcji dostarczanych przez DotNetBrowser: można nasłuchiwać, ładować zdarzenia, obsługiwać aktywność sieci, konfigurować proxy, symulować działania użytkownika, pracować z plikami cookie, uzyskiwać dostęp i modyfikować DOM, słuchać zdarzeń DOM, wywoływać JavaScript z .NET i odwrotnie, użyj kamery internetowej i mikrofonu na stronie internetowej, skonfiguruj komunikację opartą na WebRTC i więcej .

Więcej informacji można znaleźć w interfejsie API .

Poniższy fragment kodu pokazuje, jak utworzyć BrowserView, osadzić go w formularzu i załadować adres URL:

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

Po uruchomieniu powyższego przykładu otrzymasz następujące dane wyjściowe:

wprowadź opis zdjęcia tutaj

Biblioteka jest komercyjna. Licencje komercyjne obejmują pakiety wsparcia dla różnych rozmiarów zespołów. Możliwe jest również zakup kodu źródłowego biblioteki.

Oprócz własnej strony składnik jest dostępny jako pakiet NuGet i jako pakiet VSIX w Visual Studio Marketplace.

Vladimir
źródło
16
Uważaj na wysoką cenę tego produktu
jjxtra
3
To nie jest open source, jego licencja nie jest tańsza.
Ashish-BeJovial
8

Wypróbowałem kilka wariantów Webkit, ale z mojego doświadczenia nic nie przebije postępu, jaki ma OpenWebkitSharp . Uwielbiam to uwielbiam .. Wyniki HTML5 i CSS3 są tak blisko, jak to możliwe, aby dostać się do Google Chrome. Bardzo ładny interfejs API i model zdarzeń. Jeśli znajdziesz „niezaimplementowane” interfejsy API najprawdopodobniej, ponieważ nie są one zaimplementowane w Webkit. Wszystko inne działa świetnie.

OpenWebKitSharp to opakowanie .net dla silnika Webkit opartego na projekcie WebKit.NET 0.5. Dodaje więcej funkcji do wersji 0.5 i zapewnia więcej metod niż ta kompilacja. OpenWebKitSharp obsługuje zarówno wersję Cairo (0.5), jak i wersję nocną webkit (domyślnie Nightly). W wersji 1.5 Stabilna i więcej, kompilacja nocna jest dołączana i automatycznie kopiowana po zbudowaniu. We wcześniejszych wersjach dzieje się tak w przypadku kompilacji Cairo. OpenWebKitSharp obsługuje obecnie GTLite Navigator, szybką, stabilną i elastyczną przeglądarkę internetową.

Vin
źródło
1
Dzięki. To wygląda na świetne znalezisko!
Sylverdrag
Ich fora są również dość aktywne i otrzymałem bardzo szybką odpowiedź na moje pytania. Teraz używam tego do wszystkich potrzeb związanych z kontrolą przeglądarki
Vin
2
Tak, robi to wszystko, wywołujesz ExecuteScript. Jednak przeszedłem do CefSharp i mogę powiedzieć, że lubię to lepsze niż OWS
Vin
1
Kolejny obrzydliwy bałagan kodu, który nie nadaje się do użycia w jakikolwiek sposób.
Kraang Prime
1
uważaj webkit nie mogę używać proxy im mam problem z tym
skhurams 19.09.16
7

AKTUALIZACJA MAJ 2018

Jeśli celujesz w aplikację, która ma działać w systemie Windows 10, możesz teraz osadzić przeglądarkę Edge w aplikacji .net za pomocą zestawu narzędzi Windows Community Toolkit .

Przykład WPF:

1) Zainstaluj pakiet Windows Community Toolkit Nuget

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

2) Kod XAML

<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) Kod CS:

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

Przykład WinForms:

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

Więcej informacji można znaleźć pod tym linkiem .

Rahul
źródło
Zainstalowałem pakiet Nuget, ale nie działa. Nadal ty.
Deniz
6

Wypróbuj EO.WebBrowser . Jest nowy i oparty na najnowszej wersji przeglądarki Chrome. Najlepsze w tym wszystkim jest to, że pakuje wszystko w jedną bibliotekę DLL .NET, więc nie tylko jest bardzo łatwa w użyciu i wdrożeniu, ale także ta sama biblioteka DLL obsługuje wersje 32-bitowe i 64-bitowe, ponieważ jest biblioteką DLL.

użytkownik2540812
źródło
9
W przyszłości prosimy o stwierdzenie, że jest to produkt objęty licencją komercyjną, i bez względu na to, czy jest on powiązany z tym produktem, zobacz temat Unikanie jawnej autopromocji w często zadawanych pytaniach.
Andy Brown
1
Po wyszukaniu jak szalony kapelusznik przez LATA - ta „komercyjna” kontrola jest dosłownie JEDYNYM działającym zamiennikiem dla IE, z którym nie musiałem się chować i nie spieprzyłem żadnej z moich obecnych przeglądarek ustawienia. - jeśli oflagujesz, NIE jestem powiązany z EO w żaden sposób. JESTEM wkurzony, że wszystkie te rozwiązania są kompletnie śmieciami i całkowitą stratą czasu każdego.
Kraang Prime
@SanuelJackson GeckoFx działa idealnie w mojej firmie i nie spowodował żadnych problemów z ustawieniami przeglądarki
Wayne
@Wayne - to dla ciebie miło. Żaden z tych otwartych projektów nie jest zamiennikiem drop-in wymagającym znacznych modyfikacji, aby działał jako kod zarządzany, szczególnie jako drop-in formant winforms. Brakuje im funkcji, które oferuje kontrola IE i / lub są kompletne, ponieważ ciągle się zawieszają lub są powolne - nie mogą nawet wymienić wszystkich problemów tutaj. Być może w kolejnej dekadzie, kiedy Internet nie będzie już wymagał przeglądarek internetowych, być może wtedy coś wykonalnego będzie w dobrym stanie.
Kraang Prime
@SanuelJackson Hmm, chciałbym, żeby to, co powiedziałeś, było prawdą. Niestety, żadna z alternatyw (w tym GeckoFX) nie zawierała żadnych błędów przerywających wyświetlanie. Chciałbym również uniknąć wysokiej ceny za przeglądarkę Essential Objects. Ale to był jedyny, który działał dla mnie bezbłędnie.
Maiken Roskilde
5

Użyłem GeckoFX i bardzo mi to służy. Korzysta z silnika Firefox. Jedynym zastrzeżeniem, z jakim kiedykolwiek się z nim spotkałem, jest to, że emituje zdarzenie „DocumentLoaded” jeden raz, zanim dokument zostanie w pełni załadowany ... Myślę, że wystrzeliwuje jedno po załadowaniu HTML, a następnie drugie, gdy wszystkie obrazy i inne rzeczy są ładowane. Naprawiłem to, po prostu ignorując pierwszy, i jak dotąd działał pięknie.

Można go znaleźć tutaj: https://bitbucket.org/geckofx/

Jak większość porządnych bibliotek, jest open source.

Teekin
źródło
2
Wszystkie działające na podstawie Firefox elementy, które działają, przykręcają się do instalacji Firefoksa przez użytkowników. Na szczęście większość z tych rozwiązań w ogóle nie działa, a jeśli szczęście, zachowuje twoje ustawienia Firefoksa w dotyku --- nie jest tak szczęśliwy, tracisz wszystkie ustawienia i nadal masz nic lepszego niż IE jako drop-in.
Kraang Prime
1
Link nie działa i pochodzi ze starej wersji. bitbucket.org/geckofx ma aktualną wersję
Wayne
@Sanual Jackson - używałem GeckoFx od lat i nigdy nie spotkałem się z żadnymi problemami z instalacją Firefoksa przez użytkownika - w tym własną. Zgadujesz?
PandaWood,
3

MozNet jest formantem .NET, wcześniej opartym na mniej lub bardziej porzuconym kontrolce GeckoFX, ale jest w fazie rozwoju i ma znacznie więcej funkcji, niż GeckoFX może potrząsnąć. Można go znaleźć na stronie Se7en Soft .

użytkownik257033
źródło
1
GeckoFX jest aktywnie rozwijany pod adresem: bitbucket
Wayne
2

Aktualizacja 2016:

Istnieją 3 dodatkowe opcje, które mogę zasugerować:

1. BrowseEmAll.Cef

Składnik .Net, którego można użyć do zintegrowania silnika Chrome z aplikacją .Net. Oparty na CefGlue, ale nieco szybszy w aktualizacjach do najnowszej wersji Chrome. Dostępna jest również opcja wsparcia komercyjnego, która może się przydać dla niektórych. Oczywiście sam komponent jest open source .

2. BrowseEmAll.Gecko

Kolejny komponent .Net, którego można użyć do zintegrowania silnika Firefox z aplikacją .Net. Jest to oparte na Geckofx, ale w przeciwieństwie do obecnej wersji Geckofx, będzie to działać z normalną wersją kompilacji Firefoksa. Aby korzystać z Geckofx, musisz sam zbudować Firefoksa. Ponownie dostępne jest wsparcie komercyjne, ale sam komponent jest w pełni open source .

3. BrowseEmAll Core API

Potrzebujesz wszystkich różnych przeglądarek w swojej aplikacji .Net? Który interfejs API BrowseEmAll Core możesz zintegrować z aplikacją Chrome, Firefox, Webkit i Internet Explorer . Jest to jednak produkt komercyjny, więc ostrzegam.

(Pełne ujawnienie: Pracuję dla tej firmy, więc weź wszystko, co mówię, z odrobiną soli)

daniel.herken
źródło
1

Jeśli szukasz ładnej kontrolki opartej na IE - sprawdź: http://code.google.com/p/csexwb2/

Użyłem go w produktach produkcyjnych. Jest całkiem dobry i ma dobre dema, chociaż nie wydaje się, aby był utrzymywany tak dobrze, jak kiedyś.

szkocja
źródło
1

Zarówno Geckofx, jak i Webkit.net były obiecujące na początku, ale nie były na bieżąco odpowiednio z Firefoksem i Chrome, podczas gdy Internet Explorer był ulepszony, podobnie jak przeglądarka Webbrowser, choć domyślnie zachowuje się jak IE7, niezależnie od wersji IE ale można to naprawić, przechodząc do rejestru i zmieniając go na IE9 zezwalając na HTML5.

użytkownik2319683
źródło
1

Sprawdź sterowanie GeckoFX .

Wayne
źródło
0

Wypróbowałem wszystkie przeglądarki, które tam są. Niestety, jedynym, który naprawdę działał dla mnie w każdych okolicznościach, był EO.Browser. Chciałbym móc wybrać bezpłatne rozwiązanie, ale skończyło się na EO.Browser. Jest dość drogi, ale dobrze utrzymany.

AntonioC
źródło
0

Aktualizacja 2016:

Dla mnie jedyną niezawodną, ​​utrzymywaną alternatywą przeglądarki IE jest EO.WebBrowser. Dni i tydzień spędziłem na wypróbowywaniu innych. Wszystkie z nich miały pewne problemy, które w pewnym momencie zatrzymały dla mnie program.

AntonioC
źródło
1
Cóż ... ćwiczyłem przez tydzień? próba uruchomienia MS WebBrowser - wszystko bezskutecznie. Nie próbowałem żadnego z pozostałych =: - {oprócz EO.WebBrowser, który działał dla mnie pierwszy raz. Tak więc jego 20 minut z EO i sukces w porównaniu do 5 dni ze stwardnieniem rozsianym i kompletna i całkowicie haniebna porażka. Teraz muszę tylko znaleźć 750 USD, aby kupić „sukces” !!!
Richard Hammond
0

Warto zapoznać się z produktem komercyjnym, takim jak WebKitX tutaj: https://www.webkitx.com

wprowadź opis zdjęcia tutaj

Korzysta z Chromium Embedded Framework i renderuje HTML5, WebGL, PDF i Flash w Windows XP, 7, 8, 10. Zapewnia również 32-bitowe, a także 64-bitowe smaki kontroli.

Oferuje dostęp do DOM przy użyciu obiektów COM podobnych do kontrolki IE WebBrowser:

wprowadź opis zdjęcia tutaj

Możesz wywoływać JavaScript przez nazwę funkcji przekazując argumenty skalarne (nie używając eval), a także ma wywołania JavaScript dla Angulara :

wprowadź opis zdjęcia tutaj

Możesz dodać własne JavaScript między obiektami COM:

wprowadź opis zdjęcia tutaj

Obsługuje WebGL / WebAudio dla gier HTML5, które można wyłączyć w środowiskach Citrix:

wprowadź opis zdjęcia tutaj

Elias
źródło
Używam go w produkcji i całkowicie mu ufam. Próbowałem już wielu innych i utknąłem w tej przeglądarce. Twórcy są naprawdę dobrzy i „osobiści”. Nie czułem się pozostawiony samemu, jak wielu innym. Naprawdę dobry i stabilny produkt.
potężny
SO wymaga wyłączenia odpowiedzialności, więc byłoby miło, gdyby Elias zauważył, że jest CTO mobilefx, które są twórcami WebkitX
hko