Проблема с эмуляцией управления веб-браузером (FEATURE_BROWSER_EMULATION)

Используя VS2013, я создал очень простое приложение для управления веб-браузером, которое переходит на http://demos.dojotoolkit.org/demos/calendar/demo.html

Когда для этого приложения в реестре не задано FEATURE_BROWSER_EMULATION, сайт работает правильно, при добавлении приложения в этот раздел реестра (в HKLM) он работает до эмуляции IE9, но не работает со значениями IE10 и IE11 (у меня IE11 на моем компьютере).

пример:

FEATURE_BROWSER_EMULATION

myApp=9999 - works

myApp=10001 - doesn't work

не работает = не работает сборщик дат месяца. Есть какие-либо предложения, в чем может быть проблема?

Спасибо парень

2 ответа

Ниже мой WebBrowser приложение для игровой площадки (на C#), которое хорошо работает с вашим URL ( http://demos.dojotoolkit.org/demos/calendar/demo.html).

Отключение FEATURE_NINPUT_LEGACY_MODE это то, что изменило ситуацию, я считаю. Также есть пара других настроек, которые я включил. Это также показывает, как использовать HKEY_CURRENT_USER вместо HKLM, поэтому приложение не требует прав администратора.

using Microsoft.Win32;
using System;
using System.ComponentModel;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WebBrowserApp
{
    public partial class MainForm : Form
    {
        const int POLL_DELAY = 250;
        WebBrowser _webBrowser;

        // set WebBrowser features, more info: http://stackru.com/a/18333982/1768303
        static void SetWebBrowserFeatures()
        {
            // don't change the registry if running in-proc inside Visual Studio
            if (LicenseManager.UsageMode != LicenseUsageMode.Runtime)
                return;

            var appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

            var featureControlRegKey = @"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\";

            Registry.SetValue(featureControlRegKey + "FEATURE_BROWSER_EMULATION",
                appName, GetBrowserEmulationMode(), RegistryValueKind.DWord);

            // enable the features which are "On" for the full Internet Explorer browser

            Registry.SetValue(featureControlRegKey + "FEATURE_ENABLE_CLIPCHILDREN_OPTIMIZATION",
                appName, 1, RegistryValueKind.DWord);

            Registry.SetValue(featureControlRegKey + "FEATURE_AJAX_CONNECTIONEVENTS",
                appName, 1, RegistryValueKind.DWord);

            Registry.SetValue(featureControlRegKey + "FEATURE_GPU_RENDERING",
                appName, 1, RegistryValueKind.DWord);

            Registry.SetValue(featureControlRegKey + "FEATURE_WEBOC_DOCUMENT_ZOOM",
                appName, 1, RegistryValueKind.DWord);

            Registry.SetValue(featureControlRegKey + "FEATURE_NINPUT_LEGACYMODE",
                appName, 0, RegistryValueKind.DWord);
        }

        static UInt32 GetBrowserEmulationMode()
        {
            int browserVersion = 0;
            using (var ieKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer",
                RegistryKeyPermissionCheck.ReadSubTree,
                System.Security.AccessControl.RegistryRights.QueryValues))
            {
                var version = ieKey.GetValue("svcVersion");
                if (null == version)
                {
                    version = ieKey.GetValue("Version");
                    if (null == version)
                        throw new ApplicationException("Microsoft Internet Explorer is required!");
                }
                int.TryParse(version.ToString().Split('.')[0], out browserVersion);
            }

            if (browserVersion < 7)
            {
                throw new ApplicationException("Unsupported version of Microsoft Internet Explorer!");
            }

            UInt32 mode = 11000; // Internet Explorer 11. Webpages containing standards-based !DOCTYPE directives are displayed in IE11 Standards mode. 

            switch (browserVersion)
            {
                case 7:
                    mode = 7000; // Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode. 
                    break;
                case 8:
                    mode = 8000; // Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode. 
                    break;
                case 9:
                    mode = 9000; // Internet Explorer 9. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode.                    
                    break;
                case 10:
                    mode = 10000; // Internet Explorer 10.
                    break;
            }

            return mode;
        }

        // static constructor, runs first
        static MainForm()
        {
            SetWebBrowserFeatures();
        }

        public MainForm()
        {
            InitializeComponent();

            _webBrowser = new WebBrowser() { Dock = DockStyle.Fill };
            this.Controls.Add(_webBrowser);

            this.Size = new System.Drawing.Size(800, 600);
            this.Load += MainForm_Load;
        }

        // start the task
        async void MainForm_Load(object sender, EventArgs e)
        {
            try
            {
                dynamic document = await LoadDynamicPage("http://demos.dojotoolkit.org/demos/calendar/demo.html",
                    CancellationToken.None);

                MessageBox.Show(new { document.documentMode, document.compatMode }.ToString());
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        // navigate and download 
        async Task<object> LoadDynamicPage(string url, CancellationToken token)
        {
            // navigate and await DocumentCompleted
            var tcs = new TaskCompletionSource<bool>();
            WebBrowserDocumentCompletedEventHandler handler = (s, arg) =>
                tcs.TrySetResult(true);

            using (token.Register(() => tcs.TrySetCanceled(), useSynchronizationContext: false))
            {
                this._webBrowser.DocumentCompleted += handler;
                try
                {
                    this._webBrowser.Navigate(url);
                    await tcs.Task; // wait for DocumentCompleted
                }
                finally
                {
                    this._webBrowser.DocumentCompleted -= handler;
                }
            }

            // get the root element
            var documentElement = this._webBrowser.Document.GetElementsByTagName("html")[0];

            // poll the current HTML for changes asynchronosly
            var html = documentElement.OuterHtml;
            while (true)
            {
                // wait asynchronously, this will throw if cancellation requested
                await Task.Delay(POLL_DELAY, token);

                // continue polling if the WebBrowser is still busy
                if (this._webBrowser.IsBusy)
                    continue;

                var htmlNow = documentElement.OuterHtml;
                if (html == htmlNow)
                    break; // no changes detected, end the poll loop

                html = htmlNow;
            }

            // consider the page fully rendered 
            token.ThrowIfCancellationRequested();

            return this._webBrowser.Document.DomDocument;
        }
    }
}

Это работает для меня:

yourWebBrowser.ScriptErrorsSuppressed = true;

Пожалуйста, просмотрите следующий веб-сайт для получения информации о ScriptErrorsSuppressed

Выдержка из сайта:

Заметки Установите для этого свойства значение false, чтобы отлаживать веб-страницы, отображаемые в элементе управления WebBrowser. Это полезно, когда вы используете элемент управления для добавления веб-элементов управления и кода сценариев в свое приложение. Это менее полезно, когда вы используете элемент управления в качестве универсального браузера. После завершения отладки приложения установите для этого свойства значение true, чтобы подавить ошибки скрипта.

Заметка

Когда ScriptErrorsSuppressed имеет значение true, элемент управления WebBrowser скрывает все его диалоговые окна, которые происходят из базового элемента управления ActiveX, а не только ошибки сценария. Иногда вам может потребоваться подавить ошибки скрипта при отображении диалоговых окон, таких как те, которые используются для настроек безопасности браузера и входа пользователя. В этом случае установите для параметра ScriptErrorsSuppressed значение false и подавьте ошибки сценария в обработчике для события HtmlWindow.Error. Для получения дополнительной информации см. Пример кода в этом разделе.

Другие вопросы по тегам