c++ - वेब ब्राउज़र नियंत्रण अनुकरण मुद्दा(FEATURE_BROWSER_EMULATION)




registry webbrowser-control (2)

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

काम नहीं करता है = महीने की तारीख लेने वाला काम नहीं कर रहा है कोई भी सुझाव क्या समस्या हो सकती है?

धन्यवाद भाई


नीचे मेरा WebBrowser खेल का मैदान अनुप्रयोग (C # में) है जो आपके URL ( http://demos.dojotoolkit.org/demos/calendar/demo.html ) के साथ अच्छा काम करता है।

FEATURE_NINPUT_LEGACY_MODE को अक्षम करने से क्या फर्क पड़ता है, मुझे विश्वास है। मेरे द्वारा सक्षम की गई कुछ अन्य सेटिंग्स भी हैं। यह दिखाता है कि HKLM बजाय HKEY_CURRENT_USER का उपयोग कैसे किया जाता है, इसलिए ऐप को व्यवस्थापक अधिकारों की आवश्यकता नहीं है।

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://.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 जानकारी के लिए कृपया निम्नलिखित वेबसाइट की समीक्षा करें

वेबसाइट से उद्धरण:

रिमार्क्स इस गुण को वेबब्रोसर नियंत्रण में प्रदर्शित वेब पृष्ठों को डीबग करने के लिए गलत पर सेट करें। जब आप वेब-आधारित नियंत्रण और स्क्रिप्टिंग कोड को अपने एप्लिकेशन में जोड़ने के लिए नियंत्रण का उपयोग करते हैं तो यह उपयोगी होता है। जब आप एक सामान्य ब्राउज़र के रूप में नियंत्रण का उपयोग करते हैं तो यह कम उपयोगी होता है। जब आपने अपना एप्लिकेशन डीबग करना समाप्त कर लिया है, तो स्क्रिप्ट त्रुटियों को दबाने के लिए इस गुण को सही पर सेट करें।

ध्यान दें

जब ScriptErrorsSuppressed को सही पर सेट किया जाता है, तो WebBrowser नियंत्रण अपने सभी संवाद बॉक्स को छुपाता है जो कि केवल स्क्रिप्ट त्रुटियों के कारण अंतर्निहित ActiveX नियंत्रण से उत्पन्न होता है। कभी-कभी आपको डायलॉग बॉक्स प्रदर्शित करते समय स्क्रिप्ट त्रुटियों को दबाने की आवश्यकता हो सकती है जैसे कि ब्राउज़र सुरक्षा सेटिंग्स और उपयोगकर्ता लॉगिन के लिए उपयोग किया जाता है। इस स्थिति में, ScriptErrorsSuppressed को HtmlWindow.Error ईवेंट के लिए किसी हैंडलर में स्क्रिप्ट त्रुटियों को गलत और दबाने के लिए सेट करें। अधिक जानकारी के लिए, इस विषय में कोड उदाहरण देखें।







internet-explorer-11