C# — работа с компонентом WebBrowser в Visual Studio.

Суть задачи заключается в том, что компонент WebBrowser работает под управление давно устаревшего IE7 браузера. Поэтому ошибки отображение контента сайтов будут повсеместны. Для решения данной проблемы в статье предлагаются различные методы, а также рассматривается часто необходимая задача работы с браузером через прокси:

Отключение ошибок скриптов.

Для начала отключите свойство компонента, которое позволяет сыпать браузер сообщения об ошибках. Это мало поможет, зато избавит от бесконечных MessageBox с ошибками:

webBrowser1.ScriptErrorsSuppressed = true;

Изменение User-Agent Вашего браузера.

Сразу создадим класс с необходимыми функциями:

public static class IeMethods
    {
        [System.Runtime.InteropServices.DllImport(@"urlmon.dll", CharSet = CharSet.Ansi)]
        private static extern int UrlMkSetSessionOption(int dwOption, string pBuffer, int dwBufferLength, int dwReserved);

        /*
        // IE8
        IeMethods.SetAnotherUserAgent("Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)");
        // IE11
        IeMethods.SetAnotherUserAgent("Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko");
        // CHROME
        IeMethods.SetAnotherUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36");
        */

        public static void SetAnotherUserAgent(string ua)
        {
            const int urlmonOptionUseragent = 0x10000001;
            const int urlmonOptionUseragentRefresh = 0x10000002;
            var UserAgent = ua;
            UrlMkSetSessionOption(urlmonOptionUseragentRefresh, null, 0, 0);
            UrlMkSetSessionOption(urlmonOptionUseragent, UserAgent, UserAgent.Length, 0);
        }

        public static void SetBrowserEmulation(int version)
        {
            string program = Application.ExecutablePath.Split('\\').Reverse().ToList()[0];
            var key = "SOFTWARE\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION";

            Microsoft.Win32.RegistryKey hkcu = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(key);
            hkcu.SetValue(program, version, Microsoft.Win32.RegistryValueKind.DWord);
            hkcu.Close();
        }
}
    

С помощью функции SetAnotherUserAgent можно указать серверу, какой именно браузер у вас используется. Это не всегда помогает, так как IE7 всет-аки редко принимается в рассчет в наше время.

public Form1()
        { 		
			//or set user agent
            IeMethods.SetAnotherUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36");
            InitializeComponent();
            
         
        }

Изменение версии эмуляции IE.

Самое окончательное решение этой проблемы – эмуляция той версии IE, которая у вас установлена и ниже (при желании).

          	11001 (0x2AF9) - Internet Explorer 11. Webpages are displayed in IE11 edge mode, regardless of the !DOCTYPE directive.
            11000 (0x2AF8) - IE11. Webpages containing standards-based !DOCTYPE directives are displayed in IE11 edge mode. Default value for IE11.
            10001 (0×2711) - Internet Explorer 10. Webpages are displayed in IE10 Standards mode, regardless of the !DOCTYPE directive
            10000 (0×02710) - Internet Explorer 10. Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode. Default value for Internet Explorer 10.
            9999 (0x270F) - Windows Internet Explorer 9. Webpages are displayed in IE9 Standards mode, regardless of the !DOCTYPE directive.
            9000 (0×2328) - Internet Explorer 9. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode. Default value for Internet Explorer 9.Important In Internet Explorer 10, Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode.
            8888 (0x22B8) - Webpages are displayed in IE8 Standards mode, regardless of the !DOCTYPE directive.
            8000 (0x1F40) - Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode. Default value for Internet Explorer 8Important In Internet Explorer 10, Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode.
            7000 (0x1B58) - Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode. Default value for applications hosting the WebBrowser Control.
            */
            //set IE version
            IeMethods.SetBrowserEmulation(11001);

Изменение проси-сервера.

При желании работать через прокси-сервер с целью, допустим, накрутки ресурсов или с целью анонимности можно настроить прокси для большинства пользовательских приложения через настройки браузера IE. Свойства браузера -> вкладка Подключения — > Настройка сети:

Или через настройки реестра HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings:

Однако, предпочтительнее сделать это только для одного приложения. Для этого создадим класс для настройки прокси:

public static class ProxyControl
    {
        [DllImport("wininet.dll", SetLastError = true)]
        private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);

        public static void Set(string proxy)
        {
            try
            {
                const int INTERNET_OPTION_PROXY = 38;
                const int INTERNET_OPEN_TYPE_PROXY = 3;

                Struct_INTERNET_PROXY_INFO struct_IPI;

                // Filling in structure
                struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
                struct_IPI.proxy = Marshal.StringToHGlobalAnsi(proxy);
                struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local");

                // Allocating memory
                IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI));

                // Converting structure to IntPtr
                Marshal.StructureToPtr(struct_IPI, intptrStruct, true);

                bool iReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, Marshal.SizeOf(struct_IPI));
            }
            catch (Exception)
            {
            }
        }

        public struct Struct_INTERNET_PROXY_INFO
        {
            public int dwAccessType;
            public IntPtr proxy;
            public IntPtr proxyBypass;
        };
    }

И из любого места программы вызвать метод Set с целью установки или смены proxy:

ProxyControl.Set("127.0.0.1:8888");

И в заключении есть еще один более универсальный способ установки прокси через функцию UrlMkSetSessionOption, которой мы пользовались для установки userAgent, описанный в https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/ms775125(v=vs.85)

28 комментариев: C# — работа с компонентом WebBrowser в Visual Studio.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Найти на сайте
Со страниц сайта
Метки
хохмаУмные мыслиармейский юморДела семейныеДокторинформацияой болитфольклорВовочка & kidsВадим ЗверевПолитическиеСтатусы ВКотактеСобрание скороговорокБольшие и малые народностиПро животныхЗаконы МерфиженщиныПро это...Забойный наборНиколай ФоменкоВсякая всякотаалкоманы-наркоголикиВиктор ШендеровичПро услуги и рестораныБородатые анекдотыавтомобилистыТуристы и турыИскусство и киноКозьма ПрутковПро работуПро студентовОмар ХайямЧерномырдинСтатусы про женщин и мужчинВ общественном транспортеПро сумасшедшихСтанислав Ежи ЛецКриминальныеПро ШтирлицаСтас ЯнковскийСмешные статусыДурацкие законыПро юристовпро самолетыПечалькаПро братковХорошие советыНе та ориентацияМарк ТвенСтатусы про жизньНа селеКрасноармейскиеГусары и поручикиДразнилкиИностранные анекдотыСказочныеХрюн МоржовФрансуа де ЛарошфукоЧерный юморЖан-Жак РуссоОхота и рыбалкаПрограммистыЛеди и джентельменыСпортМультяшкиНа бога надейся...БизнесСчиталкиУильям ШекспирГеоргий ФрумкерФрансис БэконДикий западШутливая лотереяПраздникиБедные и богатыеРаневскаяПьер Огюстен Карон де БомаршеСоветы и ответыДикариИсторические анекдотыНикколо МакиавеллиНаполеон БонапартЗагадкиsongswordpresstraditionalpluginпоговоркиC#старостьЧастушкиmysqlbackendjavascripthostingsshajaxphpстатистикапандемия
Больше Меньше
Архивы
Рейтинг@Mail.ru