عنوان:

‫تعیین شماره نگارش IE مورد استفاده در Web Browser Control


نویسنده: وحید نصیری
تاریخ: ۱۳۹۲/۰۳/۰۸ ۱۲:۰
آدرس: www.dntips.ir
Web Browser Control دات نت و کلا ویندوز (قابل استفاده در WPF، WinForms و یا حتی CHM Viewer توکار ویندوز) بر پایه IE نصب شده بر روی سیستم عمل می‌کند.
سؤال مهم!
این کنترل از چه نگارشی از IE به صورت پیش فرض برای پردازش HTML دریافتی استفاده می‌کند؟
پاسخ: از موتور پردازشی IE 7.0 !
و تفاوتی هم نمی‌کند که در حال حاضر IE 8.0, 9.0 و یا 10 بر روی سیستم شما نصب است؛ در هر حالت به IE 7.0 مقید شده است. علت را هم این مساله عنوان کرده‌اند که اگر این شماره نگارش را تغییر دهیم، ممکن است برنامه‌های قدیمی دیگر درست نمایش داده نشوند.

نحوه تغییر موتور پردازشی Web Browser Control

متاسفانه بجز ویرایش رجیستری ویندوز، راه حل دیگری برای تغییر موتور پردازشی پیش فرض Web Browser Control وجود ندارد.
بسته به نوع سیستم عامل نصب شده، یکی (حالت 32 بیتی) و یا هر دوی (حالت 64 بیتی) مداخل زیر باید اندکی تغییر کنند:
 32 bit -> HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION  
64 bit -> HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION
در هر دو حالت یک کلید جدید DWORD را ایجاد و نام کلید را دقیقا مساوی نام فایل exe برنامه خود قرار دهید. مقدار آن یکی از موارد ذیل می‌تواند باشد:
 Force IE10 -> 10001 (0x2711)
IE10 considering !DOCTYPE directives -> 10000 (0x02710)
Force IE9 -> 9999 (0x270F)
IE9 considering !DOCTYPE directives -> 9000 (0x2328)
Force IE8 -> 8888 (0x22B8)
IE8 considering !DOCTYPE directives  -> 8000 (0x1F40)
Force IE7 -> 7000 (0x1B58)
برای نمونه چند برنامه تنظیم شده در اینجا را ملاحظه می‌کنید:


در این لیست hh.exe را هم ملاحظه می‌کنید که همان CHM Viewer توکار ویندوز است و این مورد نیز در صورت عدم تنظیم فوق، از IE 7.0 استفاده خواهد کرد.

یک مثال: تنظیمات IIS بر روی ویندوز سرور 2003 جهت استفاده از IE 8.0
 Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION]
"w3wp.exe"=dword:00001f40

نظرات

  • مهران موسوی در ۱۳۹۲/۰۳/۰۸ ۱۶:۰
    پیشنهاد میکنم از WebKit.net استفاده کنید . یک Wrapper واسه Webkit Engine نوشته و توسعه داده شده توسط زبان C# .
      
    من چندی پیش نیاز داشتم از یک Engine مناسب که از CSS3 و HTML5 پشتیبانی کامل بکنه استفاده کنم . طی تحقیقاتم باهاش آشنا شدم . نتیجه رندر این موتور مثل Chrome هست و به خوبی از پس CSS3 بر میاد. برای جزئات بیشتر و دانلود اینجا کلیک کنید

    برای مشاهده طیف پشتیبانی هایی که webkit از CSS3 داره این لینک رو ببینید
    • وحید نصیری در ۱۳۹۲/۰۳/۰۸ ۱۷:۴۰
      ممنون. حداقل دو گزینه سورس باز 100 درصد تهیه شده با کدهای دات نت نیز برای رندر HTML وجود دارند:
      الف) تبدیلگر HTML به XAML نوشته شده توسط خود مایکروسافت
      ب) پروژه فوق العاده جالب HTML Renderer 
  • وحید نصیری در ۱۳۹۴/۱۱/۱۶ ۱۳:۵۷
    یک نکته‌ی تکمیلی
    تعیین شماره نگارش IE مورد استفاده‌ی توسط برنامه به صورت خودکار:
    using System;
    using System.Diagnostics;
    using Microsoft.Win32;
    using System.Windows.Forms;
    
    namespace Core
    {
        public static class UseLatestVersionOfIE
        {
            /// <summary>
            /// Use the latest version of IE in WebBrowser control
            /// </summary>
            public static void SetWebBrowserVersion()
            {
                RegistryKey regkey = null;
                try
                {
                    regkey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", writable: true);
                    if (regkey == null)
                    {
                        return;
                    }
    
                    var regVal = getInstalledIEVersion();
                    var appName = string.Format("{0}.exe", Process.GetCurrentProcess().ProcessName);
                    regkey.SetValue(appName, regVal, RegistryValueKind.DWord);
                }
                catch (Exception ex)
                {
                  // todo: log ...
                }
                finally
                {
                    if (regkey != null)
                    {
                        regkey.Close();
                    }
                }
            }
    
            private static int getInstalledIEVersion()
            {
                int browserVer;
                using (var wb = new WebBrowser())
                {
                    browserVer = wb.Version.Major;
                }
    
                int regVal;
                if (browserVer >= 11)
                    regVal = 11001;
                else
                    switch (browserVer)
                    {
                        case 10:
                            regVal = 10001;
                            break;
                        case 9:
                            regVal = 9999;
                            break;
                        case 8:
                            regVal = 8888;
                            break;
                        default:
                            regVal = 7000;
                            break;
                    }
                return regVal;
            }
        }
    }
    در اینجا شماره نگارش IE از کنترل WebBrowser دریافت می‌شود و همیشه به آخرین نگارش تنظیم خواهد شد و همچنین چون از Registry.CurrentUser استفاده می‌کند، نیازی به دسترسی مدیریتی برای اعمال ندارد.