Thay thế điều khiển .NET WebBrowser bằng trình duyệt tốt hơn, như Chrome?


432

Có cách nào tương đối dễ dàng để chèn trình duyệt hiện đại vào ứng dụng .NET không?

Theo như tôi hiểu, WebBrowserđiều khiển là một trình bao bọc cho IE , điều này sẽ không thành vấn đề ngoại trừ có vẻ như đó là một phiên bản IE rất cũ , với tất cả những gì liên quan đến việc vặn vít CSS, rủi ro bảo mật tiềm ẩn (nếu công cụ kết xuất không được vá, tôi thực sự có thể mong đợi các sự cố tràn bộ đệm zillion được khắc phục không?) và các vấn đề khác.

Tôi đang sử dụng Visual Studio C # (phiên bản express - nó có tạo ra sự khác biệt nào ở đây không?)

Tôi muốn tích hợp một trình duyệt web tốt trong các ứng dụng của mình. Trong một số, tôi chỉ sử dụng nó để xử lý quá trình đăng ký người dùng, giao diện với một số tính năng của trang web của tôi và những thứ khác theo thứ tự đó, nhưng tôi có một ứng dụng khác sẽ yêu cầu kiểm soát nhiều lỗi hơn.

Tôi cần:

  • Một trình duyệt có thể tích hợp bên trong một cửa sổ ứng dụng của tôi (không phải là một cửa sổ riêng biệt)
  • Hỗ trợ tốt cho CSS, js và các công nghệ web khác, ngang bằng với bất kỳ trình duyệt hiện đại nào
  • Các chức năng cơ bản của trình duyệt như "điều hướng", "quay lại", "tải lại" ...
  • Truy cập tự do vào mã trang và đầu ra.

Tôi đã suy nghĩ về Chrome, vì nó có giấy phép BSD, nhưng tôi sẽ hài lòng với phiên bản IE gần đây.

Càng nhiều càng tốt, tôi muốn giữ mọi thứ đơn giản. Điều tốt nhất sẽ là nếu một người có thể vá WebBrowserđiều khiển hiện có , vốn đã chiếm khoảng 70% những gì tôi cần, nhưng tôi không nghĩ điều đó là có thể.

Tôi đã tìm thấy một điều khiển activeX cho Mozilla ( http://www.iol.ie/~locka/mozilla/control.htm ) nhưng có vẻ như đó là một phiên bản cũ, vì vậy nó không nhất thiết phải là một cải tiến.

Tôi đang mở để gợi ý


19
Tại sao bạn nói rằng điều khiển WebBrowser sử dụng phiên bản IE cũ? Nó sử dụng phiên bản được cài đặt trên hệ thống của người dùng, mặc dù WebBrowser IE8 dường như mặc định là kết xuất IE7: blog.msdn.com/ie/archive/2009/03/10/ trên
Tim Robinson

17
Bởi vì nó không giống như vậy trên máy của tôi. Tôi đã cài đặt IE8 nhưng điều khiển hiển thị các sự cố hiển thị mà tôi chưa thấy kể từ IE 5. Một hình thức đăng nhập rất đơn giản, 2 trường với một cú chạm CSS có màn hình bị cắt xén và một số màn hình javascript không hoạt động, trong khi nó hiển thị tốt trong IE8, Firefox, Chrome, Opera ... vì vậy tôi cho rằng công cụ kết xuất là một công cụ cũ. Tôi có thể hoàn toàn sai về điều đó và có lẽ vấn đề thực tế khác với những gì tôi nghĩ.
Sylverdrag

3
@Sylverdrag: Bạn sai rồi. Nó sử dụng IE mới nhất trên hệ thống của bạn. Tuy nhiên, tôi đọc được ở đâu đó rằng điều khiển WebBrowser có vấn đề tương thích ngược mạnh hơn trình duyệt độc lập. Ví dụ, IE8 có thể có một biểu tượng để nhấp để bật chế độ IE7. Là một phần của chương trình của bạn, điều này là không thể, vì vậy điều khiển mặc định ở chế độ trước đó để tương thích. OTOH, tôi chưa đọc cách đặt nó để sử dụng "chế độ IE8".
John Saunders

55
Thật ra, John sanders, bạn đã sai. Nó sử dụng eg4 và bạn cần thay đổi giá trị đăng ký để bảo nó sử dụng hiện tại. Tra cứu "mô phỏng chế độ tính năng" và bạn sẽ nhận được câu trả lời của bạn, đã thay đổi gần đây, được sử dụng để bao gồm từ khóa gốc nhưng họ đã thay đổi nó, google các từ khóa tôi đã đề cập với "điều khiển webbrowser" và bạn sẽ tìm thấy bài viết msDN.
Erx_VB.NExT.Coder

8
Theo mặc định, một WebBrowserđiều khiển được lưu trữ sử dụng mô phỏng IE7, trừ khi được hướng dẫn khác với FEATURE_BROWSER_EMULATION. Đây là tài liệu ở đây: blogs.msdn.com/b/askie/archive/2009/03/23/...
noseratio

Câu trả lời:


171

Thanh toán các ràng buộc CefSharp .Net , một dự án tôi đã bắt đầu một thời gian trước đó rất may được cộng đồng đón nhận và biến thành một thứ gì đó tuyệt vời.

Dự án kết thúc khung nhúng Chromium và đã được sử dụng trong một số dự án lớn bao gồm máy khách Windows của Rdio, Facebook Messenger cho Windows và Github cho Windows.

Nó có tính năng kiểm soát trình duyệt cho WPFWinforms và có vô số tính năng và điểm mở rộng. Dựa trên Chromium, nó cũng rất nhanh.

Lấy nó từ NuGet: Install-Package CefSharp.WpfhoặcInstall-Package CefSharp.WinForms

Kiểm tra các ví dụ và đưa ra suy nghĩ / phản hồi / yêu cầu kéo của bạn: https://github.com/cefsharp/CefSharp

BSD được cấp phép


2
Tôi đã chuyển sang CEfSharp từ OWS và tôi có thể khẳng định rằng nó có chất lượng rất cao và cộng đồng tích cực. Yêu nó. github.com/cefsharp/CefSharp
Vin

1
CefSharp là tuyệt vời nhưng lưu ý rằng các thư viện rất lớn (20+ mb cuối cùng tôi đã xem) vì vậy chúng có thể không phù hợp cho một dự án nhẹ hơn.
Skyl3lazer

1
@ANguyen có bạn có thể
chillitom

1
Rất rất vui khi biết rằng chính bạn là người đã bắt đầu dự án này! Gần đây tôi đã sử dụng cefsharp, tuy nhiên, tôi có thể thấy rằng kích thước thư viện là 80+ MB, rất lớn, nhưng cần thiết cho hoạt động đúng (đặc biệt là kết xuất mượt mà) của ứng dụng. Có cách nào để giảm bớt điều này?
Aditya Bokade

5
Điều này đã phá vỡ dự án của tôi. Tất cả các tham chiếu bị hỏng sau khi cài đặt gói winforms nuget.
chập chững

84

Chrome sử dụng (một nhánh của) Webkit nếu bạn không biết, cũng được Safari sử dụng. Đây là một vài câu hỏi có cùng một hướng:

Bộ webkit một không tuyệt vời như các trạng thái trả lời khác, một phiên bản không còn hoạt động (mã google một) và phiên bản Mono là thử nghiệm. Thật tuyệt nếu ai đó đã nỗ lực để tạo ra một trình bao bọc .NET tốt cho nó nhưng đó không phải là điều mà bất cứ ai dường như muốn làm - điều đáng ngạc nhiên là giờ đây nó đã hỗ trợ HTML5 và rất nhiều tính năng khác mà IE (8 ) thiếu động cơ.

Cập nhật (2014)

Có dự án được cấp phép kép mới cho phép bạn nhúng Chrome vào các ứng dụng .NET của mình được gọi là Awesomium . Nó đi kèm với .NET api nhưng yêu cầu khá nhiều hack để kết xuất (ví dụ vẽ cửa sổ trình duyệt vào bộ đệm, vẽ bộ đệm dưới dạng hình ảnh và làm mới trên bộ đếm thời gian).

Tôi nghĩ rằng đây là trình duyệt được sử dụng bởi Origin trong Battlefield 3.

Cập nhật (2016)

Hiện tại đã có DotnetBrowser , một sự thay thế thương mại cho Awesomium. Nó dựa trên Chromium.


Cảm ơn. Tôi sẽ có một cái nhìn vào bọc Gecko. Mặc dù vậy, một điều, câu trả lời ban đầu nói rằng "Tất cả những gì bạn cần làm là đăng ký điều khiển Mozilla ActiveX" và tôi nghĩ rằng các phiên bản Express không thể đăng ký các điều khiển bổ sung. Tôi có thiếu một cái gì đó rõ ràng?
Sylverdrag

4
@Syl các phiên bản thể hiện có thể đăng ký nhiều điều khiển mà bạn cần. Những gì họ sẽ không làm là cho phép bạn cài đặt plugin vào visual studio.
Joel Coehoorn

1
Tôi đã có những trải nghiệm khá tệ khi sử dụng WebKit với C # và cuối cùng tôi đã phải giải quyết thành phần trình duyệt web mặc định đi kèm với .NET
Sumit Ghosh

1
Kể từ ngày này, các dự án trên không thể thay thế thả vào. Trình biên dịch lỗi galore + không ổn định. Awesomium, là rác hoàn chỉnh và hoàn toàn.
Kraang Prime

"Tôi nghĩ rằng đây là trình duyệt được Origin sử dụng trong Battlefield 3." Điều này là không chính xác. Tôi biết điều này bởi vì tôi đã buộc ứng dụng này sử dụng tức là trên windows ten bởi vì khi nó được mặc định để cạnh thì nó không hoạt động. Đây là một thời gian trước đây, có thể là một vấn đề được giải quyết.
Theyouthis 2/2/2016

64

Tôi đã thử nghiệm các lựa chọn thay thế cho thành phần trình duyệt Web C # vài ngày nay và đây là danh sách của tôi:

1. Sử dụng phiên bản IE mới hơn 8,9:

Thành phần trình duyệt web là IE7 chứ không phải IE8? Làm thế nào để thay đổi điều này?

Ưu điểm:

  • Không có nhiều công việc cần thiết để chạy nó
  • một số hỗ trợ HTML5 / CSS3 nếu IE9, đầy đủ nếu IE10

Nhược điểm:

  • Máy đích phải được cài đặt phiên bản IE đích, IE10 vẫn ở chế độ xem trước trên Win7

Điều này không đòi hỏi nhiều công việc và bạn có thể nhận được một số hỗ trợ HTML5 và CSS3 mặc dù IE9 thiếu một số tính năng CSS3 và HTML5 tốt nhất. Nhưng tôi chắc chắn rằng bạn có thể chạy IE10 theo cách tương tự. Vấn đề là hệ thống đích sẽ phải cài đặt IE10 và vì vẫn còn trong bản xem trước trên Windows 7 nên tôi sẽ đề xuất chống lại nó.

2. OpenWebKitSharp

OpenWebKitSharp là một trình bao bọc .net cho công cụ webkit dựa trên dự án WebKit.NET 0.5. WebKit là một công cụ bố trí được Chrome / Safari sử dụng

Ưu điểm:

  • Tích cực phát triển
  • Hỗ trợ HTML5 / CSS3

Nhược điểm:

  • Nhiều tính năng không được thực hiện
  • Không hỗ trợ x64 (Phải xây dựng ứng dụng cho x86)

OpenWebKit khá đẹp mặc dù nhiều tính năng chưa được triển khai, tôi gặp một số vấn đề khi sử dụng nó với visual studio, nó ném tham chiếu đối tượng null ở đây và sau đó trong chế độ thiết kế, có một số vấn đề js. Mọi người sử dụng nó sẽ gần như ngay lập tức nhận thấy cảnh báo js không làm gì cả. Các sự kiện như mouseup, mousedown ... vv không hoạt động, js kéo và thả là lỗi và v.v.

Tôi cũng gặp một số khó khăn khi cài đặt nó vì nó yêu cầu phiên bản cụ thể của VC được cài đặt lại, vì vậy, ngoại trừ tôi đã xem nhật ký sự kiện, tìm thấy phiên bản của VC và cài đặt nó.

3. Tắc kè

Ưu điểm:

  • Hoạt động trên đơn
  • Tích cực phát triển
  • Hỗ trợ HTML5 / CSS3

Nhược điểm:

  • ̶O̶̶̶̶

GeckoFX là một điều khiển Webrowser đa nền tảng để nhúng vào Ứng dụng WinForms. Điều này có thể được sử dụng với .NET trên Windows và với mono trên Linux. Tắc kè là một công cụ bố trí được sử dụng bởi Firefox.

Tôi đã gặp một vài thông tin rằng GeckoFX không được phát triển tích cực, điều đó không đúng, tất nhiên nó luôn luôn là một hoặc hai phiên bản của Firefox nhưng điều đó là bình thường, tôi thực sự ấn tượng bởi hoạt động và chính điều khiển. Nó làm mọi thứ tôi cần, nhưng tôi cần một chút thời gian để chạy nó, đây là một hướng dẫn nhỏ để chạy nó:

  1. Tải xuống GeckoFx-Windows-16.0-0.2 , tại đây bạn có thể kiểm tra xem GeckoFX mới hơn có sẵn không
  2. Thêm tài liệu tham khảo cho hai dll tải về
  3. Vì GeckoFX là trình bao bọc bạn cần XulRunner, hãy truy cập Danh sách phiên bản để xem bạn cần cái nào
  4. Bây giờ chúng tôi biết phiên bản XulRunner nào chúng tôi cần, chúng tôi đi đến bản phát hành Mozilla XulRunner , đi đến thư mục phiên bản -> runtimes -> xulrunner- (your_version) .en-US.win32.zip, trong trường hợp của chúng tôi xulrunner-16.0.en- US.win32.zip
  5. Giải nén mọi thứ và sao chép tất cả các tệp vào bin \ Debug (hoặc phát hành nếu dự án của bạn được đặt thành phát hành)
  6. Chuyển đến trình thiết kế phòng thu trực quan của biểu mẫu của bạn, đi đến hộp công cụ, nhấp chuột phải vào bên trong -> Chọn các mục -> Duyệt -> Tìm tệp dll GformoFX đã tải xuống -> OK
  7. Bây giờ bạn nên có quyền kiểm soát mới GeckoWebBrowser

Nếu bạn thực sự phải sử dụng Chrome, hãy xem sản phẩm này có tên Awesomium , nó miễn phí cho các dự án phi thương mại, nhưng giấy phép là vài nghìn đô la cho thương mại.


4
Mô tả rất hay về cách tải GeckoFx lên và chạy. +1
Alex Essilfie

Khi xây dựng Geckofx-Winforms tôi cần 4 thư viện gtk # (atk-sharp, gdk-sharp, glib-sharp và gtk-sharp), vì vậy tôi phải cài đặt Mono trước.
bernhardrusch

Câu trả lời này thật ngoạn mục.
Mike Cole

Một phân tích tuyệt vời thực sự. Tôi muốn biết nếu bạn tình cờ kiểm tra Awesomium với các ứng dụng C #. Bạn có nói gì về điều đó không? Tôi chưa thử nó nhưng có vẻ đáng tin cậy đối với tôi sau khi nhìn vào hội đồng quản trị mà họ đã đề cập trên trang của họ.
Abdul Rehman

2
@Wayne nếu bạn muốn làm đúng, bạn nên tạo một thư mục trong dự án của bạn hoặc dự án thanh toán trong đó bạn sẽ bao gồm tất cả các tệp, tắc kè fx dlls và xul runner và đặt chúng sao chép luôn, sau đó trên mọi hành động xây dựng chúng sẽ nhận được được sao chép vào thư mục build / debug của bạn hoặc được xuất bản nếu bạn xuất bản từ VS, cũng có phương thức Xpcom.Initialize mà bạn nên gọi và bạn có thể vượt qua đường dẫn tệp xul của người chạy, hy vọng điều đó sẽ giúp
formatc

41

Tôi cũng gặp vấn đề tương tự, WebBrowser đang sử dụng một phiên bản IE cũ, với một số thông tin tôi đã tìm thấy đoạn mã sau đây để thay đổi đăng ký và khiến WebBrowser sử dụng phiên bản IE mới nhất có thể:

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

Bạn chỉ cần tạo một lớp và đặt mã này vào đó, sau đó chạy đoạn mã sau khi chương trình bắt đầu:

 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

Bạn có thể sử dụng nó như:

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

1
Thông minh!! Cảm ơn bạn rất nhiều!
Ben

1
Được dịch sang Python (hoạt động trên ứng dụng IronPython) và nó hoạt động hoàn hảo. Cảm ơn!
David

1
Điều đó cứu mạng tôi! Cảm ơn
Neeraj Dubey

1
Điều này thật tuyệt vời nhưng liệu có thể thiết lập lại phiên bản mô phỏng? Có vẻ như phiên bản chỉ có thể được đặt một lần trong ứng dụng WinForms. Mặc dù có thể thiết lập lại nó có hiệu lực là, một khi được đặt và đặt lại trong sổ đăng ký, nó sẽ không được đọc lại với các giá trị đăng ký mới trong ứng dụng WinForms.
cymorg

1
@DarrenMB theo như tôi biết nó sử dụng IE11
Ashkan Mobayen Khiabani

27

Bạn có thể sử dụng sổ đăng ký để đặt phiên bản IE để kiểm soát webbrowser. Truy cập: HKLM \ SOFTWARE \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION và thêm "yourApplicationName.exe" với giá trị của browser_emulation Để xem giá trị của browser_emulation, hãy tham khảo liên kết: http://msdn.microsoft.com/en- / l Library / ee330730% 28VS85% 29.aspx # browser_emulation


10
Và nếu bạn đang gỡ lỗi trong phòng thu trực quan, có lẽ bạn sẽ phải sử dụng "yourApplicationName.vshost.exe"
newenglander

3
Và nếu bạn đang gỡ lỗi trong phòng thu trực quan, có lẽ bạn chỉ cần bỏ chọn "Kích hoạt quy trình lưu trữ Visual Studio" trên tab Gỡ lỗi thuộc tính dự án của bạn. Sau đó, bạn có thể sử dụng tên exe của mình mà không cần phần "vshost".
Daniel Vygolov

1
@golavietnam Bạn có thể vui lòng giúp tôi với điều này không, tôi đã thử hướng dẫn của bạn và sử dụng các hướng dẫn trên liên kết bạn cung cấp nhưng nó vẫn không hoạt động. Khi tôi truy cập WhatIsMyBrowser.com bằng điều khiển webbrowser, nó sẽ cho tôi biết tôi đang sử dụng eg11 BUT ở chế độ tương thích 7 và nhiều trang web từ chối hoạt động và gửi cho tôi thông báo "vui lòng nâng cấp trình duyệt của bạn". Làm cách nào tôi có thể buộc điều khiển webbrowser sử dụng phiên bản mới nhất tức là được cài đặt (tức là 11) theo cách này không hoạt động, tôi đã thử nó hàng trăm lần.
jay_t55

Cảm ơn bạn, nó đã làm việc và cứu ngày của tôi
Tấn Nguyên

18

Hãy xem điều khiển Mono.WebBrowser - nó nhúng Gecko (như được sử dụng bởi Firefox) hoặc WebKit (như được Safari sử dụng) vào WinForms (không sử dụng ActiveX).


16

Tôi biết đây không phải là điều khiển WebBrowser 'thay thế', nhưng tôi đã gặp một số vấn đề hiển thị khủng khiếp trong khi hiển thị một trang đang sử dụng BootStrap 3+ để bố trí, v.v. và sau đó tôi tìm thấy một bài đăng gợi ý tôi sử dụng như sau. Rõ ràng nó đặc trưng cho IE và bảo nó sử dụng biến thể mới nhất được tìm thấy trên máy khách để kết xuất (vì vậy nó sẽ không sử dụng IE7 vì tôi tin là mặc định)

Vì vậy, chỉ cần đặt:

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

một nơi nào đó trong phần đầu của tài liệu của bạn.

Nếu tất nhiên đó không phải là tài liệu của bạn, thì điều này rõ ràng sẽ không hữu ích (mặc dù cá nhân tôi coi đó là một lỗ hổng bảo mật nếu bạn đang đọc các trang không phải do chính bạn tạo ra thông qua điều khiển webbrowser - tại sao không sử dụng trình duyệt web!)

Chúc may mắn.


Nếu bạn muốn điều này để làm việc trên một máy tính đang chạy IE7, đừng đặt nó ở đâu đó trong <head>, đặt nó như là đứa trẻ đầu tiên của <head>. Chúng tôi phải mất một thời gian để tìm ra điều này.
Sylvain

Xin lỗi tôi có nghĩa là IE8 không phải IE7 trong bình luận trước đây của tôi. Vì vậy, trên IE8, nếu bạn không đặt <meta>là con đầu tiên của <head>nó, nó sẽ chạy ở chế độ tương thích, không phải ở chế độ cạnh.
Sylvain

Tôi đã sử dụng plugin webbrowser trong một ứng dụng winform và đây là một sự trợ giúp rất lớn. Trang tôi đang nhấn đang sử dụng jquery & angularjs đang bị nghẹt vì nghĩ rằng trình duyệt là IE7 mặc dù tôi đã cài đặt IE10.
Kywillis

Đó là công việc cho tôi! Bạn cũng có thể sử dụng điều này để đặt thành một phiên bản IE cụ thể, ví dụ: <meta http-Equiv = "X-UA-Tương thích" content = "IE = 10" /> và luôn luôn trình duyệt hoạt động như 10 (tất nhiên bạn cần đã cài đặt cùng một phiên bản hoặc cao hơn
triển tự do 14/2/2015

Điều này là hoàn hảo cho usecase của tôi. Tôi muốn hiển thị các báo cáo định dạng html đẹp hơn. Có rất nhiều nội dung CSS có sẵn ngoài đó. Đây là cách tiếp cận tốt hơn so với nhúng chrome / firefox.
MD Luffy

13

Hãy xem thư viện DotNetBrowser . Nó cung cấp các điều khiển trình duyệt WPF và WinForms dựa trên Chromium, khá dễ dàng để nhúng vào ứng dụng .NET. Nó hỗ trợ tất cả các tiêu chuẩn web hiện đại bao gồm HTML5, CSS3 và JavaScript. Trang được hiển thị trông giống hệt như trong Google Chrome.

Thư viện kế thừa kiến ​​trúc đa quy trình của Chromium - mỗi trang web được hiển thị trong một quy trình Chromium riêng biệt và ứng dụng sẽ tiếp tục hoạt động ngay cả sau khi sự cố plugin hoặc bất kỳ lỗi không mong muốn nào khác xảy ra trên trang web.

Dưới đây là một số tính năng hữu ích khác, được cung cấp bởi DotNetBrowser: có thể nghe các sự kiện tải, xử lý hoạt động mạng, định cấu hình proxy, mô phỏng hành động của người dùng, làm việc với cookie, truy cập và sửa đổi DOM, nghe các sự kiện DOM, gọi JavaScript từ .NET và ngược lại, sử dụng máy ảnh web và micrô trên trang web, thiết lập giao tiếp dựa trên WebRTC và hơn thế nữa .

Kiểm tra Tài liệu tham khảo API để biết thêm chi tiết.

Đoạn mã dưới đây trình bày cách tạo BrowserView, nhúng nó vào Biểu mẫu và tải 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");
        }
    }
}

Khi bạn chạy ví dụ trên, bạn sẽ nhận được kết quả sau:

nhập mô tả hình ảnh ở đây

Thư viện là thương mại. Giấy phép thương mại bao gồm các gói hỗ trợ cho các kích cỡ nhóm khác nhau. Cũng có thể mua mã nguồn của thư viện.

Bên cạnh trang riêng, thành phần này có sẵn dưới dạng gói NuGetgói VSIX trong Thị trường Visual Studio.


16
Coi chừng giá cao của sản phẩm này
jjxtra

3
Nó không phải là nguồn mở, giấy phép của nó không rẻ hơn.
Ashish-BeJovial

8

Tôi đã thử một số biến thể Webkit, nhưng theo kinh nghiệm của tôi, không có gì vượt qua được những tiến bộ mà OpenWebkitSharp có. Yêu nó yêu nó .. Điểm số HTML5 và CSS3 gần như có thể đến với Google Chrome. API rất đẹp và mô hình sự kiện. Nếu bạn thấy API "không được triển khai" rất có thể vì chúng không được triển khai trong Webkit. Tất cả những thứ khác hoạt động tuyệt vời.

OpenWebKitSharp là một trình bao bọc .net cho công cụ webkit dựa trên dự án WebKit.NET 0.5. Nó bổ sung thêm nhiều chức năng cho phiên bản 0.5 và nó cung cấp nhiều phương thức hơn bản dựng đó. OpenWebKitSharp hỗ trợ cả bản dựng Cairo (0,5) và bản dựng hàng đêm của webkit (Hàng đêm theo mặc định). Trong phiên bản 1.5 Ổn định và hơn thế nữa, bản dựng hàng đêm được bao gồm và tự động sao chép sau khi xây dựng. Trong các phiên bản trước, điều này xảy ra với bản dựng cairo. OpenWebKitSharp hiện cung cấp cho GTLite Navigator, một trình duyệt web nhanh, ổn định và linh hoạt.


1
Cảm ơn. Trông giống như một phát hiện tuyệt vời!
Sylverdrag

Diễn đàn của họ cũng khá tích cực và tôi đã nhận được phản hồi rất nhanh cho câu hỏi của mình. Bây giờ tôi đang sử dụng điều này cho tất cả các nhu cầu kiểm soát webbrowser của mình
Vin

2
Vâng, nó làm tất cả điều đó, bạn gọi ExecuteScript. Tuy nhiên, tôi đã chuyển sang CefSharp và tôi có thể nói với bạn rằng tôi thích nó tốt hơn OWS
Vin

1
Một mớ hỗn độn mã ghê tởm khác không thể sử dụng được cho đến nay.
Kraang Prime

1
hãy cẩn thận với webkit không thể sử dụng proxy vì tôi gặp vấn đề với điều này
skhurams

7

CẬP NHẬT 2018 CÓ THỂ

Nếu bạn đang nhắm mục tiêu ứng dụng chạy trên Windows 10, thì bây giờ bạn có thể nhúng trình duyệt Edge vào ứng dụng .net của mình bằng cách sử dụng Bộ công cụ cộng đồng Windows .

Ví dụ về WPF:

1) Cài đặt gói Nuget của Windows Community Toolkit

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

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

Ví dụ về 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"));
  }
}

Vui lòng tham khảo liên kết này để biết thêm thông tin.


Tôi đã cài đặt Gói Nuget, nhưng nó không hoạt động. Vẫn ty.
Deniz

6

Hãy dùng thử EO.WebBrowser . Nó là mới và dựa trên phiên bản mới nhất của trình duyệt Chrome. Phần tốt nhất của nó là nó đóng gói mọi thứ bên trong một dll .NET duy nhất, vì vậy nó không chỉ rất dễ sử dụng và triển khai mà còn cùng một DLL hỗ trợ cả 32 bit và 64 bit bởi vì đó là một dll .NET.


9
Trong tương lai, vui lòng cho biết đây là sản phẩm được cấp phép thương mại và cho dù bạn có bất kỳ liên kết nào với sản phẩm hay không, hãy xem Tránh tự quảng cáo quá mức trong Câu hỏi thường gặp.
Andy Brown

1
Sau khi tìm kiếm như một kẻ điên rồ trong NĂM ---- điều khiển "thương mại" này thực sự là sự thay thế thả xuống làm việc DUY NHẤT cho IE mà tôi không phải loay hoay và không làm hỏng bất kỳ trình duyệt hiện tại nào của mình cài đặt. - nếu gắn cờ, tôi KHÔNG được liên kết với EO dưới bất kỳ hình dạng hoặc hình thức nào. Tôi bực mình vì tất cả những giải pháp khác này hoàn toàn là s__t - rác hoàn toàn và lãng phí hoàn toàn thời gian của mọi người.
Kraang Prime

@SanuelJackson GeckoFx đang hoạt động hoàn hảo tại công ty của tôi và không gây ra bất kỳ vấn đề nào với cài đặt trình duyệt
Wayne

@Wayne - đó là tốt cho bạn. Không có dự án mở nào trong số này là một sự thay thế thả vào yêu cầu sửa đổi đáng kể để hoạt động như mã được quản lý, đặc biệt là kiểm soát winforms thả xuống. Chúng thiếu chức năng mà điều khiển IE cung cấp và / hoặc hoàn thành s__t khi chúng bị sập liên tục hoặc chậm - thậm chí không thể liệt kê tất cả các vấn đề ở đây. Có lẽ trong một thập kỷ nữa khi internet không còn yêu cầu trình duyệt web nữa, có thể sau đó một cái gì đó khả thi sẽ ở trong tình trạng hoạt động.
Thủ tướng Kraang

@SanuelJackson Hmm, tôi ước những gì bạn nói là sự thật. Thật không may, không có lựa chọn thay thế nào (bao gồm GeckoFX) không có lỗi dừng hiển thị đối với tôi. Tôi cũng ước mình có thể tránh được mức giá cao cho trình duyệt Essential Object. Nhưng đó là người duy nhất làm việc hoàn hảo cho tôi.
Maiken Roskilde

5

Tôi đã sử dụng GeckoFX và nó phục vụ tôi rất tốt. Nó sử dụng công cụ Firefox. Nhắc nhở duy nhất tôi từng gặp phải với nó là nó phát ra sự kiện "DocumentLoaded" một lần trước khi tài liệu thực sự được tải đầy đủ ... Tôi nghĩ rằng nó bắn ra một khi HTML được tải, và sau đó là một sự kiện khác khi tất cả hình ảnh và công cụ được tải. Tôi đã sửa nó bằng cách bỏ qua cái đầu tiên, và nó đã hoạt động rất tốt mà không bị lỗi cho đến nay.

Bạn có thể tìm thấy nó ở đây: https://bitbucket.org/geckofx/

Giống như hầu hết các thư viện phong nha, nó là nguồn mở.


2
Tất cả các thành phần dựa trên firefox hoạt động, bắt vít với người dùng cài đặt Firefox. May mắn thay, hầu hết các giải pháp này đều không hoạt động, và nếu may mắn, nó giữ cho các cài đặt Firefox của bạn không hoạt động --- không may mắn như vậy, bạn mất tất cả các cài đặt của mình và vẫn không có gì tốt hơn IE khi thả xuống.
Kraang Prime

1
Liên kết đã chết và từ bản dựng cũ. bitbucket.org/geckofx có phiên bản hiện tại
Wayne

@Sanual Jackson - Tôi đã sử dụng GeckoFx trong nhiều năm và chưa bao giờ gặp bất kỳ vấn đề nào với cài đặt Firefox của người dùng - bao gồm cả của riêng tôi. Bạn chỉ đang đoán?
PandaWood

3

MozNet là một điều khiển .NET, trước đây dựa trên điều khiển GeckoFX bị bỏ rơi ít nhiều, nhưng đang được phát triển đầy đủ và có nhiều tính năng hơn GeckoFX có thể làm rung chuyển. Bạn có thể tìm thấy nó tại trang web Se7en Soft .


1
GeckoFX đang được tích cực phát triển tại: bitbucket
Wayne


2

Cập nhật 2016:

Có 3 tùy chọn bổ sung tôi có thể đề xuất:

1. DuyệtEmAll.Cef

Một thành phần .Net có thể được sử dụng để tích hợp công cụ Chrome vào Ứng dụng .Net của bạn. Dựa trên CefGlue nhưng nhanh hơn một chút về các bản cập nhật cho phiên bản Chrome mới nhất. Ngoài ra, có một tùy chọn hỗ trợ thương mại có sẵn mà có thể có ích cho một số người. Tất nhiên chính thành phần này là nguồn mở .

2. DuyệtEmAll.Gecko

Một thành phần .Net khác có thể được sử dụng để tích hợp công cụ Firefox vào ứng dụng .Net của bạn. Điều này dựa trên Geckofx nhưng không giống như phiên bản Geckofx hiện tại, nó sẽ hoạt động với bản phát hành bình thường của Firefox. Để sử dụng Geckofx, bạn sẽ cần phải tự xây dựng Firefox. Một lần nữa hỗ trợ thương mại có sẵn nhưng bản thân thành phần này là nguồn mở hoàn toàn .

3. Duyệt qua API lõi

Cần tất cả các trình duyệt khác nhau trong Ứng dụng .Net của bạn? API lõi DuyệtEmAll nào bạn có thể tích hợp Chrome, Firefox, Webkit và Internet Explorer vào ứng dụng của mình. Đây là một sản phẩm thương mại mặc dù vậy được cảnh báo.

(Tiết lộ đầy đủ: Tôi làm việc cho công ty này vì vậy hãy lấy mọi thứ tôi nói bằng một hạt muối)


1

Nếu bạn đang tìm kiếm một điều khiển dựa trên IE đẹp - hãy xem: http://code.google.com.vn/p/csexwb2/

Tôi đã sử dụng nó trong các sản phẩm sản xuất. Nó khá tốt và có các bản demo tốt mặc dù hiện tại dường như không được duy trì như trước đây.


1

Geckofx và Webkit.net ban đầu đều hứa hẹn, nhưng chúng không cập nhật với Firefox và Chrome tương ứng trong khi Internet Explorer được cải thiện, điều khiển Webbrowser cũng vậy, mặc dù nó hoạt động như IE7 bất kể bạn là phiên bản IE nào có nhưng điều đó có thể được khắc phục bằng cách vào sổ đăng ký và thay đổi nó thành IE9 cho phép HTML5.




0

Tôi đã thử tất cả các trình duyệt ngoài đó. Thật không may, người duy nhất thực sự làm việc cho tôi trong mọi trường hợp là EO.Browser. Tôi ước tôi có thể chọn một giải pháp miễn phí, nhưng tôi đã kết thúc với EO.Browser. Nó là khá cay, nhưng duy trì tốt.


0

Cập nhật 2016:

Đối với tôi, trình duyệt duy nhất đáng tin cậy, được duy trì thay thế cho IE là EO.WebBrowser. Tôi đã dành nhiều ngày và tuần để thử những người khác. Tất cả trong số họ đã có một số vấn đề dừng chương trình cho tôi tại một số điểm.


1
Chà ... tôi đã chơi đùa trong một tuần? cố gắng làm cho MS WebBrowser hoạt động - tất cả đều vô ích. Không thử bất kỳ cái nào khác =: - {ngoại trừ EO.WebBrowser lần đầu tiên hoạt động với tôi. Vì vậy, 20 phút với EO và thành công so với 5 ngày với MS và thất bại hoàn toàn và hoàn toàn. Tất cả những gì tôi phải làm bây giờ là tìm $ 750 để mua 'thành công' !!!
Richard Hammond

0

Có thể đáng để xem một sản phẩm thương mại như WebKitX tại đây: https://www.webkitx.com

nhập mô tả hình ảnh ở đây

Nó sử dụng khung nhúng Chromium và hiển thị HTML5, WebGL, PDF và Flash trên Windows XP, 7, 8, 10. Nó cũng cung cấp các điều khiển 32 bit cũng như 64 bit của điều khiển.

Nó cung cấp quyền truy cập DOM bằng cách sử dụng các đối tượng COM tương tự như điều khiển IE WebBrowser:

nhập mô tả hình ảnh ở đây

Bạn có thể gọi JavaScript bằng tên hàm truyền các đối số vô hướng (không sử dụng eval) và nó cũng có các hàm gọi lại JavaScript cho Angular :

nhập mô tả hình ảnh ở đây

Bạn có thể thêm các đối tượng COM có thể tương tác của riêng bạn vào JavaScript:

nhập mô tả hình ảnh ở đây

Nó hỗ trợ WebGL / WebAudio để chơi trò chơi HTML5, mà bạn có thể tắt cho môi trường Citrix:

nhập mô tả hình ảnh ở đây


Tôi sử dụng nó trong sản xuất, và tôi tin tưởng nó hoàn toàn. Tôi đã thử nhiều cái khác và tôi bị kẹt với trình duyệt này. Các nhà phát triển thực sự tốt và "cá nhân". Tôi không cảm thấy bị bỏ lại một mình như với nhiều người khác. Sản phẩm thực sự tốt và ổn định.
tmighty

SO yêu cầu từ chối trách nhiệm, vì vậy thật tuyệt khi Elias chỉ ra rằng anh ta là CTO của mobilefx, là người tạo ra WebkitX
hko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.