vb.net visual-studio-2010 visual-studio-2012 webbrowser-control

vb.net - La página web funciona en IE, Chrome y Firefox, pero no cuando se usa el control.NET WebBrowser



visual-studio-2010 visual-studio-2012 (2)

Estoy usando el control WebBrowser en Visual Studio 2010 e intento mostrar la página: http://lk21.org .

Dentro de esa página web hay muchos scripts cargados, y funciona bien si lo abro a través de un navegador web como Firefox, Chrome y la última versión de IE.

Mi pregunta es, ¿por qué muestra "Solicitud incorrecta" cuando intenté usar el componente WebBrowser para navegar a esa página?

Mira esto:

ACTUALIZAR:

La página se carga muy bien con la respuesta de Visual Vincent.

Sin embargo, los videos flash en el sitio web (o creo que es algo similar a flash) no se pueden reproducir. Vea la comparación en las imágenes a continuación.

Lo extraño es que si abro YouTube, el flash funciona bien. Después de un poco de investigación, parece ser causado por algo más. ¿Alguna idea de cómo resolverlo?

Internet Explorer: funciona bien:

Control de WebBrowser: por alguna razón, el video está bloqueado y no se puede reproducir:


Basado en la respuesta de @ Visual Vincent , aquí hice una solución modificada:

1 - Enumeración IEBrowserEmulationMode :

'''''' ---------------------------------------------------------------------------------------------------- '''''' <summary> '''''' Specifies a Internet Explorer browser emulation mode. '''''' </summary> '''''' ---------------------------------------------------------------------------------------------------- '''''' <remarks> '''''' <see href="https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/general-info/ee330730(v=vs.85)"/> '''''' </remarks> '''''' ---------------------------------------------------------------------------------------------------- Public Enum IEBrowserEmulationMode As Integer '''''' <summary> '''''' Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode. '''''' </summary> IE7 = 7000 '''''' <summary> '''''' Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode. '''''' </summary> IE8 = 8000 '''''' <summary> '''''' Webpages are displayed in IE8 Standards mode, regardless of the declared !DOCTYPE directive. '''''' <para></para> '''''' Failing to declare a !DOCTYPE directive causes the page to load in Quirks. '''''' </summary> IE8Standards = 8888 '''''' <summary> '''''' Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode. '''''' </summary> IE9 = 9000 '''''' <summary> '''''' Webpages are displayed in IE9 Standards mode, regardless of the declared !DOCTYPE directive. '''''' <para></para> '''''' Failing to declare a !DOCTYPE directive causes the page to load in Quirks. '''''' </summary> IE9Standards = 9999 '''''' <summary> '''''' Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode. '''''' </summary> IE10 = 10000 '''''' <summary> '''''' Webpages are displayed in IE10 Standards mode, regardless of the !DOCTYPE directive. '''''' </summary> IE10Standards = 10001 '''''' <summary> '''''' Webpages containing standards-based !DOCTYPE directives are displayed in IE11 edge mode. '''''' </summary> IE11 = 11000 '''''' <summary> '''''' Webpages are displayed in IE11 edge mode, regardless of the declared !DOCTYPE directive. '''''' <para></para> '''''' Failing to declare a !DOCTYPE directive causes the page to load in Quirks. '''''' </summary> IE11Edge = 11001 End Enum

2 - Enumeración RegistryScope .

'''''' ---------------------------------------------------------------------------------------------------- '''''' <summary> '''''' Specifies a registry scope (a root key). '''''' </summary> '''''' ---------------------------------------------------------------------------------------------------- Public Enum RegistryScope As Integer '''''' <summary> '''''' This refers to the HKEY_LOCAL_MACHINE (or HKLM) registry root key. '''''' <para></para> '''''' Configuration changes made on the subkeys of this root key will affect all users. '''''' </summary> Machine = 0 '''''' <summary> '''''' This refers to the HKEY_CURRENT_USER (or HKCU) registry root key. '''''' <para></para> '''''' Configuration changes made on the subkeys of this root key will affect only the current user. '''''' </summary> CurrentUser = 1 End Enum

3 - Propiedad BrowserEmulationMode , para obtener o establecer el modo de emulación de navegador IE para la aplicación actual.

'''''' ---------------------------------------------------------------------------------------------------- '''''' <summary> '''''' Gets or sets the Internet Explorer browser emulation mode for the current application. '''''' </summary> '''''' ---------------------------------------------------------------------------------------------------- '''''' <seealso href="https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/general-info/ee330730(v=vs.85)"/> '''''' ---------------------------------------------------------------------------------------------------- '''''' <example> This is a code example to get, set and verify the IE browser emulation mode for the current process. '''''' <code> '''''' Dim scope As RegistryScope = RegistryScope.CurrentUser '''''' Dim oldMode As IEBrowserEmulationMode '''''' Dim newMode As IEBrowserEmulationMode '''''' '''''' oldMode = BrowserEmulationMode(scope) '''''' BrowserEmulationMode(scope) = IEBrowserEmulationMode.IE11Edge '''''' newMode = BrowserEmulationMode(scope) '''''' '''''' Console.WriteLine(String.Format("Old Mode: {0} ({1})", oldMode, CStr(oldMode))) '''''' Console.WriteLine(String.Format("New Mode: {0} ({1})", newMode, CStr(newMode))) '''''' '''''' Dim f As New Form() With {.Size = New Size(1280, 720)} '''''' Dim wb As New WebBrowser With {.Dock = DockStyle.Fill} '''''' f.Controls.Add(wb) '''''' f.Show() '''''' wb.Navigate("http://www.whatversion.net/browser/") '''''' </code> '''''' </example> '''''' ---------------------------------------------------------------------------------------------------- '''''' <param name="scope"> '''''' The registry scope. '''''' </param> '''''' ---------------------------------------------------------------------------------------------------- '''''' <value> '''''' The Internet Explorer browser emulation mode. '''''' </value> '''''' ---------------------------------------------------------------------------------------------------- Public Shared Property BrowserEmulationMode(ByVal scope As RegistryScope) As IEBrowserEmulationMode <DebuggerStepThrough> Get Return GetIEBrowserEmulationMode(Process.GetCurrentProcess().ProcessName, scope) End Get <DebuggerStepThrough> Set(value As IEBrowserEmulationMode) SetIEBrowserEmulationMode(Process.GetCurrentProcess().ProcessName, scope, value) End Set End Property

3 - Función GetIEBrowserEmulationMode y método SetIEBrowserEmulationMode , para obtener o establecer el modo de emulación del navegador IE para una aplicación externa.

'''''' ---------------------------------------------------------------------------------------------------- '''''' <summary> '''''' Gets the Internet Explorer browser emulation mode for the specified process. '''''' </summary> '''''' ---------------------------------------------------------------------------------------------------- '''''' <seealso href="https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/general-info/ee330730(v=vs.85)"/> '''''' ---------------------------------------------------------------------------------------------------- '''''' <example> This is a code example. '''''' <code> '''''' Dim processName As String = Process.GetCurrentProcess().ProcessName '''''' Dim scope As RegistryScope = RegistryScope.CurrentUser '''''' Dim mode As IEBrowserEmulationMode = GetIEBrowserEmulationMode(processName, scope) '''''' '''''' Console.WriteLine(String.Format("Mode: {0} ({1})", mode, CStr(mode))) '''''' </code> '''''' </example> '''''' ---------------------------------------------------------------------------------------------------- '''''' <param name="processName"> '''''' The process name (eg. ''cmd.exe''). '''''' </param> '''''' '''''' <param name="scope"> '''''' The registry scope. '''''' </param> '''''' ---------------------------------------------------------------------------------------------------- '''''' <returns> '''''' The resulting <see cref="IEBrowserEmulationMode"/>. '''''' </returns> '''''' ---------------------------------------------------------------------------------------------------- '''''' <exception cref="NotSupportedException"> '''''' </exception> '''''' ---------------------------------------------------------------------------------------------------- <DebuggerStepThrough> Public Shared Function GetIEBrowserEmulationMode(ByVal processName As String, ByVal scope As RegistryScope) As IEBrowserEmulationMode processName = Path.GetFileNameWithoutExtension(processName) Using rootKey As RegistryKey = If(scope = RegistryScope.CurrentUser, RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default), RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default)), subKey As RegistryKey = rootKey.CreateSubKey("Software/Microsoft/Internet Explorer/MAIN/FeatureControl/FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadSubTree) Dim value As Integer = CInt(subKey.GetValue(String.Format("{0}.exe", processName), 0, RegistryValueOptions.None)) '' If no browser emulation mode is retrieved from registry, then return default version for WebBrowser control. If (value = 0) Then Return IEBrowserEmulationMode.IE7 End If If [Enum].IsDefined(GetType(IEBrowserEmulationMode), value) Then Return DirectCast(value, IEBrowserEmulationMode) Else Throw New NotSupportedException(String.Format("Undefined browser emulation value retrieved from registry: ''{0}''", value)) End If End Using End Function '''''' ---------------------------------------------------------------------------------------------------- '''''' <summary> '''''' Gets the Internet Explorer browser emulation mode for the specified process. '''''' </summary> '''''' ---------------------------------------------------------------------------------------------------- '''''' <seealso href="https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/general-info/ee330730(v=vs.85)"/> '''''' ---------------------------------------------------------------------------------------------------- '''''' <example> This is a code example. '''''' <code> '''''' Dim p As Process = Process.GetCurrentProcess() '''''' Dim scope As RegistryScope = RegistryScope.CurrentUser '''''' Dim mode As IEBrowserEmulationMode = GetIEBrowserEmulationMode(p, scope) '''''' '''''' Console.WriteLine(String.Format("Mode: {0} ({1})", mode, CStr(mode))) '''''' </code> '''''' </example> '''''' ---------------------------------------------------------------------------------------------------- '''''' <param name="p"> '''''' The process. '''''' </param> '''''' '''''' <param name="scope"> '''''' The registry scope. '''''' </param> '''''' ---------------------------------------------------------------------------------------------------- '''''' <returns> '''''' The resulting <see cref="IEBrowserEmulationMode"/>. '''''' </returns> '''''' ---------------------------------------------------------------------------------------------------- '''''' <exception cref="NotSupportedException"> '''''' </exception> '''''' ---------------------------------------------------------------------------------------------------- <DebuggerStepThrough> Public Shared Function GetIEBrowserEmulationMode(ByVal p As Process, ByVal scope As RegistryScope) As IEBrowserEmulationMode Return GetIEBrowserEmulationMode(p.ProcessName, scope) End Function '''''' ---------------------------------------------------------------------------------------------------- '''''' <summary> '''''' Sets the Internet Explorer browser emulation mode for the specified process. '''''' </summary> '''''' ---------------------------------------------------------------------------------------------------- '''''' <seealso href="https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/general-info/ee330730(v=vs.85)"/> '''''' ---------------------------------------------------------------------------------------------------- '''''' <example> This is a code example. '''''' <code> '''''' Dim processName As String = Process.GetCurrentProcess().ProcessName '''''' Dim scope As RegistryScope = RegistryScope.CurrentUser '''''' Dim oldMode As IEBrowserEmulationMode '''''' Dim newMode As IEBrowserEmulationMode '''''' '''''' oldMode = GetIEBrowserEmulationMode(processName, scope) '''''' SetIEBrowserEmulationMode(processName, scope, IEBrowserEmulationMode.IE11Edge) '''''' newMode = GetIEBrowserEmulationMode(processName, scope) '''''' '''''' Console.WriteLine(String.Format("Old Mode: {0} ({1})", oldMode, CStr(oldMode))) '''''' Console.WriteLine(String.Format("New Mode: {0} ({1})", newMode, CStr(newMode))) '''''' '''''' Dim f As New Form() With {.Size = New Size(1280, 720)} '''''' Dim wb As New WebBrowser With {.Dock = DockStyle.Fill} '''''' f.Controls.Add(wb) '''''' f.Show() '''''' wb.Navigate("http://www.whatversion.net/browser/") '''''' </code> '''''' </example> '''''' ---------------------------------------------------------------------------------------------------- '''''' <param name="processName"> '''''' The process name (eg. ''cmd.exe''). '''''' </param> '''''' '''''' <param name="scope"> '''''' The registry scope. '''''' </param> '''''' '''''' <param name="mode"> '''''' The Internet Explorer browser emulation mode to set. '''''' </param> '''''' ---------------------------------------------------------------------------------------------------- '''''' <exception cref="NotSupportedException"> '''''' </exception> '''''' ---------------------------------------------------------------------------------------------------- <DebuggerStepThrough> Public Shared Sub SetIEBrowserEmulationMode(ByVal processName As String, ByVal scope As RegistryScope, ByVal mode As IEBrowserEmulationMode) processName = Path.GetFileNameWithoutExtension(processName) Dim currentIEBrowserEmulationMode As IEBrowserEmulationMode = GetIEBrowserEmulationMode(processName, scope) If (currentIEBrowserEmulationMode = mode) Then Exit Sub End If Using rootKey As RegistryKey = If(scope = RegistryScope.CurrentUser, RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default), RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default)), subKey As RegistryKey = rootKey.CreateSubKey( "Software/Microsoft/Internet Explorer/MAIN/FeatureControl/FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadWriteSubTree) subKey.SetValue(String.Format("{0}.exe", processName), DirectCast(mode, Integer), RegistryValueKind.DWord) End Using End Sub '''''' ---------------------------------------------------------------------------------------------------- '''''' <summary> '''''' Sets the Internet Explorer browser emulation mode for the specified process. '''''' </summary> '''''' ---------------------------------------------------------------------------------------------------- '''''' <seealso href="https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/general-info/ee330730(v=vs.85)"/> '''''' ---------------------------------------------------------------------------------------------------- '''''' <example> This is a code example. '''''' <code> '''''' Dim processName As Process = Process.GetCurrentProcess() '''''' Dim scope As RegistryScope = RegistryScope.CurrentUser '''''' Dim oldMode As IEBrowserEmulationMode '''''' Dim newMode As IEBrowserEmulationMode '''''' '''''' oldMode = GetIEBrowserEmulationMode(p, scope) '''''' SetIEBrowserEmulationMode(p, scope, IEBrowserEmulationMode.IE11Edge) '''''' newMode = GetIEBrowserEmulationMode(p, scope) '''''' '''''' Console.WriteLine(String.Format("Old Mode: {0} ({1})", oldMode, CStr(oldMode))) '''''' Console.WriteLine(String.Format("New Mode: {0} ({1})", newMode, CStr(newMode))) '''''' '''''' Dim f As New Form() With {.Size = New Size(1280, 720)} '''''' Dim wb As New WebBrowser With {.Dock = DockStyle.Fill} '''''' f.Controls.Add(wb) '''''' f.Show() '''''' wb.Navigate("http://www.whatversion.net/browser/") '''''' </code> '''''' </example> '''''' ---------------------------------------------------------------------------------------------------- '''''' <param name="p"> '''''' The process. '''''' </param> '''''' '''''' <param name="scope"> '''''' The registry scope. '''''' </param> '''''' '''''' <param name="mode"> '''''' The Internet Explorer browser emulation mode to set. '''''' </param> '''''' ---------------------------------------------------------------------------------------------------- '''''' <exception cref="NotSupportedException"> '''''' </exception> '''''' ---------------------------------------------------------------------------------------------------- <DebuggerStepThrough> Public Shared Sub SetIEBrowserEmulationMode(ByVal p As Process, ByVal scope As RegistryScope, ByVal mode As IEBrowserEmulationMode) SetIEBrowserEmulationMode(p.ProcessName, scope, mode) End Sub

Ejemplo de uso para obtener, establecer y verificar el modo de emulación del navegador IE para el proceso actual:

Dim scope As RegistryScope = RegistryScope.CurrentUser Dim oldMode As IEBrowserEmulationMode Dim newMode As IEBrowserEmulationMode oldMode = BrowserEmulationMode(scope) BrowserEmulationMode(scope) = IEBrowserEmulationMode.IE11Edge newMode = BrowserEmulationMode(scope) Console.WriteLine(String.Format("Old Mode: {0} ({1})", oldMode, CStr(oldMode))) Console.WriteLine(String.Format("New Mode: {0} ({1})", newMode, CStr(newMode))) Dim f As New Form() With {.Size = New Size(1280, 720)} Dim wb As New WebBrowser With {.Dock = DockStyle.Fill} f.Controls.Add(wb) f.Show() wb.Navigate("http://www.whatversion.net/browser/")

Ejemplo de uso para obtener, establecer y verificar el modo de emulación del navegador IE para un proceso específico:

Dim processName As String = Process.GetCurrentProcess().ProcessName Dim scope As RegistryScope = RegistryScope.CurrentUser Dim oldMode As IEBrowserEmulationMode Dim newMode As IEBrowserEmulationMode oldMode = GetIEBrowserEmulationMode(processName, scope) SetIEBrowserEmulationMode(processName, scope, IEBrowserEmulationMode.IE11Edge) newMode = GetIEBrowserEmulationMode(processName, scope) Console.WriteLine(String.Format("Old Mode: {0} ({1})", oldMode, CStr(oldMode))) Console.WriteLine(String.Format("New Mode: {0} ({1})", newMode, CStr(newMode))) Dim f As New Form() With {.Size = New Size(1280, 720)} Dim wb As New WebBrowser With {.Dock = DockStyle.Fill} f.Controls.Add(wb) f.Show() wb.Navigate("http://www.whatversion.net/browser/")


Probablemente tiene que ver con que el control WebBrowser utiliza de manera predeterminada un modo de emulación de documentos de IE 7, lo que significa que todas las páginas se manejan con el motor de Internet Explorer 7. Dado que esa versión es bastante antigua, la mayoría de los sitios web de hoy no son compatibles con ella, lo que afecta la funcionalidad cuando visita la página.

Puede cambiar este comportamiento agregando un valor para su aplicación en la clave de registro Software/Microsoft/Internet Explorer/MAIN/FeatureControl/FEATURE_BROWSER_EMULATION en la sección HKEY_LOCAL_MACHINE o HKEY_CURRENT_USER . Al hacerlo, está obligando a su aplicación a usar una versión específica del motor IE.

He escrito una clase que te ayudará con esto:

''A class for changing the WebBrowser control''s document emulation. ''Written by Visual Vincent, 2017. Imports Microsoft.Win32 Imports System.Security Imports System.Windows.Forms Public NotInheritable Class InternetExplorer Private Sub New() End Sub Public Const InternetExplorerRootKey As String = "Software/Microsoft/Internet Explorer" Public Const BrowserEmulationKey As String = InternetExplorerRootKey & "/MAIN/FeatureControl/FEATURE_BROWSER_EMULATION" Public Const ActiveXObjectCachingKey As String = InternetExplorerRootKey & "/MAIN/FeatureControl/FEATURE_OBJECT_CACHING" Private Shared ReadOnly WebBrowserInstance As New WebBrowser ''Used to get the current IE version in a .NET-friendly manner. Public Enum BrowserEmulation As Integer IE7 = 7000 IE8 = 8000 IE8Standards = 8888 IE9 = 9000 IE9Standards = 9999 IE10 = 10000 IE10Standards = 10001 IE11 = 11000 IE11Edge = 11001 End Enum Public Shared Sub SetLatestBrowserEmulation(ByVal Root As RegistryRoot) Dim Emulation As BrowserEmulation = BrowserEmulation.IE7 Select Case WebBrowserInstance.Version.Major Case Is >= 11 : Emulation = BrowserEmulation.IE11Edge Case 10 : Emulation = BrowserEmulation.IE10Standards Case 9 : Emulation = BrowserEmulation.IE9Standards Case 8 : Emulation = BrowserEmulation.IE8Standards End Select InternetExplorer.SetBrowserEmulation(Root, Emulation) End Sub Public Shared Sub SetBrowserEmulation(ByVal Root As RegistryRoot, ByVal Emulation As BrowserEmulation) Using RootKey As RegistryKey = Root.Root Dim EmulationKey As RegistryKey = RootKey.OpenSubKey(BrowserEmulationKey, True) If EmulationKey Is Nothing Then EmulationKey = RootKey.CreateSubKey(BrowserEmulationKey, RegistryKeyPermissionCheck.ReadWriteSubTree) Using EmulationKey EmulationKey.SetValue(Process.GetCurrentProcess().ProcessName & ".exe", CType(Emulation, Integer), RegistryValueKind.DWord) End Using End Using End Sub Public Shared Sub SetActiveXObjectCaching(ByVal Root As RegistryRoot, ByVal Enabled As Boolean) Using RootKey As RegistryKey = Root.Root Dim ObjectCachingKey As RegistryKey = RootKey.OpenSubKey(ActiveXObjectCachingKey, True) If ObjectCachingKey Is Nothing Then ObjectCachingKey = RootKey.CreateSubKey(ActiveXObjectCachingKey, RegistryKeyPermissionCheck.ReadWriteSubTree) Using ObjectCachingKey ObjectCachingKey.SetValue(Process.GetCurrentProcess().ProcessName & ".exe", CType(If(Enabled, 1, 0), Integer), RegistryValueKind.DWord) End Using End Using End Sub Public NotInheritable Class RegistryRoot Private _root As RegistryKey Public ReadOnly Property Root As RegistryKey Get Return _root End Get End Property Public Shared ReadOnly Property HKEY_LOCAL_MACHINE As RegistryRoot Get Return New RegistryRoot(Registry.LocalMachine) End Get End Property Public Shared ReadOnly Property HKEY_CURRENT_USER As RegistryRoot Get Return New RegistryRoot(Registry.CurrentUser) End Get End Property Private Sub New(ByVal Root As RegistryKey) Me._root = Root End Sub End Class End Class

Para usarlo, coloque una de estas líneas en el evento de Startup la aplicación:

InternetExplorer.SetLatestBrowserEmulation(InternetExplorer.RegistryRoot.HKEY_LOCAL_MACHINE) ''HKEY_CURRENT_USER is recommended if you do not want to run your application with administrative privileges. InternetExplorer.SetLatestBrowserEmulation(InternetExplorer.RegistryRoot.HKEY_CURRENT_USER)

( NOTA: El uso de la raíz HKEY_LOCAL_MACHINE requiere privilegios administrativos)

El método InternetExplorer.SetLatestBrowserEmulation() establecerá la emulación del navegador para su aplicación, en la raíz del registro especificada, a la última versión INSTALADA de Internet Explorer.

Sin embargo, utilizando el método InternetExplorer.SetBrowserEmulation() puede controlar manualmente qué versión de IE debe usar (¡no recomendado!) .

Lee mas:

EDITAR

Parece que no puedo ingresar a ese sitio, pero por lo que he leído , ha habido problemas con Flash alojado en el control WebBrowser .

Lo que puede intentar es deshabilitar la función ActiveX Object Caching , que aparentemente puede causar algunos problemas para los controles Flash.

Actualicé la clase de InternetExplorer anterior. Copie y pegue, luego agregue esta línea al evento de inicio de su aplicación:

InternetExplorer.SetActiveXObjectCaching(InternetExplorer.RegistryRoot.HKEY_CURRENT_USER, False)

Si todavía no funciona, me temo que no tienes suerte. No he podido encontrar nada más que sea útil.