¿Cómo puedo hacer que el control WebBrowser muestre contenidos modernos?
Creé una aplicación Winforms que usa un control WebBrowser; Asigno dinámicamente su Uri. Funcionó bien por un tiempo, pero ahora recibo este mensaje:
Parece que estás utilizando un navegador no compatible. Los navegadores más antiguos pueden poner en riesgo tu seguridad, son lentos y no funcionan con las funciones más nuevas de Google Maps. Para acceder a Google Maps, deberá actualizar a un navegador moderno.
Las dos últimas palabras son un enlace y, siguiendo ese enlace, veo:
Actualmente estás usando... IE 11
Entonces, está bien, el componente WebBrowser usa IE 11; ¿Cómo puedo cambiar eso?
Mi máquina está configurada para utilizar Chrome como navegador; ¿Quizás el control debería usar cualquiera que sea su navegador actual? No sé si eso es posible/factible.
ACTUALIZAR
Bien, estoy dispuesto a probar la sugerencia de Reza. Pero cuando navego hasta el lugar especificado en regedit y hago clic derecho en el panel derecho para agregar una nueva entrada, tengo tres opciones:
Clave, valor de cadena, valor binario
Creo que los valores de cadena son las cadenas ".exe" y los valores binarios son los valores "dword", pero ¿cuáles deberían ser los valores "clave"?
Nota: La publicación trata sobre el control de WebBrowser; sin embargo, para todos los nuevos proyectos .NET, la solución principal es utilizar WebView2 . Para obtener más información, echa un vistazo a esta publicación:
- Comenzando con WebView2 .
Control del navegador web
El WebBrowser
control utiliza la misma versión de Internet Explorer que está instalada en su sistema operativo, pero no utiliza el modo de documento más reciente de forma predeterminada y muestra el contenido en modo de compatibilidad.
Síntoma: como síntoma, el sitio funciona correctamente en Internet Explorer u otros navegadores, pero WebBrowser
el control no muestra bien el sitio y, en algunos sitios, muestra errores de script.
Solución: puede indicarle al WebBrowser
control que utilice el modo de documento más reciente sin el modo de compatibilidad bajo WebBrowser
control. Puede seguir las instrucciones aquí para desactivar la configuración mediante el registro.
[Referencia: Emulación de navegador ]
Aplicar la configuración de emulación del navegador mediante código
Si desea aplicar la configuración mediante código, ejecute el siguiente código una vez:
using (var key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(
@"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION",
true))
{
var app = System.IO.Path.GetFileName(Application.ExecutablePath);
key.SetValue(app, 11001, Microsoft.Win32.RegistryValueKind.DWord);
key.Close();
}
En el código anterior, he usado 11001
lo que significa modo IE11 Edge.
Internet Explorer 11. Las páginas web se muestran en el modo perimetral IE11, independientemente de la directiva !DOCTYPE declarada. No declarar una directiva !DOCTYPE hace que la página se cargue en Quirks.
Aplicar la configuración de Emulación del navegador manualmente
Abra el editor del Registro y busque HKEY_CURRENT_USER
, vaya a la siguiente clave:
Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
Agregue los siguientes valores:
"YourApplicationFileName.exe"=dword:00002af9
"YourApplicationFileName.vshost.exe"=dword:00002af9
(En versiones anteriores de Visual Studio, también necesitaba agregar el valor vshost.exe cuando ejecutaba su programa en Visual Studio).
Para crear entradas, haga clic derecho en un área vacía del panel derecho, luego, en la ventana que aparece después de seleccionar dword
el valor, elija hexadecimal e ingrese 2af9
:
En los pasos anteriores, he usado 11001
lo que significa modo IE11 Edge.
Utilice el control compatible con WebView para Windows Forms
También puede utilizar el nuevo control WebViewCompatible para Windows Forms . Puede ver pasos sencillos para usar aquí: Reemplace el control WebBrowser por un nuevo control compatible con WebView para Windows Forms .
WebViewCompatible
utiliza uno de los dos motores de renderizado para admitir un conjunto más amplio de clientes de Windows:
En dispositivos con Windows 10, el nuevo motor de renderizado Microsoft Edge se utiliza para incrustar una vista que representa contenido HTML con formato enriquecido desde un servidor web remoto, código generado dinámicamente o archivos de contenido.
En dispositivos que ejecutan versiones anteriores de Windows, se utiliza System.Windows.Controls.WebBrowser, que proporciona renderizado basado en el motor de Internet Explorer.
Nota:
WebView2
es un reemplazo deWebView
yWebViewCompatible
.
Establecer metaetiqueta compatible con X-UA
En caso de que tenga acceso al contenido html de la página y pueda cambiar el contenido (por ejemplo, es un archivo html local o el sitio le pertenece), puede configurar una X-UA-Compatibile
metaetiqueta similar a head
: <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
.
Utilice otros controles del navegador
Puede confiar en otros controles del navegador como CefSharp
.
En mi caso, para el protocolo personalizado integrado en una aplicación, solo permitiré explorar las páginas proporcionadas por la aplicación y ningún contenido externo, por lo que quería omitir el guardado en el Registro de Windows. Cuando probé después de seguir la respuesta de Reza Aghaei y descubrí que puedes cambiar el modo de compatibilidad desde la página de contenido. Esto evitará la necesidad de configurar una clave de registro, pero deberá agregarla a cada página.
Para cambiar el modo de compatibilidad de una página, debe agregar una metaetiqueta para que el motor de renderizado la aplique:
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
</head>
<body>
...
</body>
</html>
Los siguientes procedimientos agregarán la clave correcta y la eliminarán nuevamente. Llame a CreateBrowserKey al cargar el formulario en el que se encuentra su navegador web. Luego, al cerrar el formulario, llame a RemoveBrowserKey
Private Sub CreateBrowserKey(Optional ByVal IgnoreIDocDirective As Boolean = False)
' Dim basekey As String = Microsoft.Win32.Registry.CurrentUser.ToString
Dim value As Int32
' Dim thisAppsName As String = My.Application.Info.AssemblyName & ".exe"
' Value reference: http://msdn.microsoft.com/en-us/library/ee330730%28v=VS.85%29.aspx
' IDOC Reference: http://msdn.microsoft.com/en-us/library/ms535242%28v=vs.85%29.aspx
Select Case (New WebBrowser).Version.Major
Case 8
If IgnoreIDocDirective Then
value = 8888
Else
value = 8000
End If
Case 9
If IgnoreIDocDirective Then
value = 9999
Else
value = 9000
End If
Case 10
If IgnoreIDocDirective Then
value = 10001
Else
value = 10000
End If
Case 11
If IgnoreIDocDirective Then
value = 11001
Else
value = 11000
End If
Case Else
Exit Sub
End Select
Microsoft.Win32.Registry.SetValue(Microsoft.Win32.Registry.CurrentUser.ToString & BrowserKeyPath, _
Process.GetCurrentProcess.ProcessName & ".exe", _
value, _
Microsoft.Win32.RegistryValueKind.DWord)
End Sub
Private Sub RemoveBrowserKey()
Dim key As Microsoft.Win32.RegistryKey
key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(BrowserKeyPath.Substring(1), True)
key.DeleteValue(Process.GetCurrentProcess.ProcessName & ".exe", False)
End Sub
La clase C# WebBrowser es básicamente un contenedor de IE y debido a esto no se puede cambiar.
Vea este enlace:
El control WebBrowser es un contenedor administrado alrededor de un componente instalado con Internet Explorer.
Para alternativas puedes consultar
WebKit.NET
GeckoFX