Buenas
Todos sabemos que el TWebBrowser encapsula el Internet Explorer instalado en el sistema. Pero los que habéis trabajado o usado en profundidad el TWebBrowser, seguro que habéis llegado al punto en que la página web que queríais mostrar en él no se visualizaba igual que en el propio Internet Explorer. Esto me ha pasado a mi intentando mostrar en un TWebBrowser un heatmap mediante la API de Google Maps como el que podemos ver en esta página. Entonces…. por qué si una página web se visualiza bien en IE no lo hace igual en el TWebBrowser?
Resulta que nuestro amigo TWebBrowser, cuando la versión de nuestro IE es inferior a la 8 (de la 5 a la 7) sí que muestra las páginas tal y como se visualizan en el propio IE (con las limitaciones que tienen estas viejas versiones del IE, claro está). En cambio, cuando la versión de IE instalada en el sistema es la 8 o superior, por defecto, nuestro TWebBrowser mostrará las páginas web en modo de compatibilidad, por lo que las visualizará como si de un IE 7 se tratara.
¿Y qué podemos hacer para que ésto no sea así? La solución pasa por especificar de forma explícita el modo de compatibilidad que queremos usar para nuestra aplicación, y para ello tenemos que modificar el registro de Windows.
Veamos un ejemplo. Imaginemos que nuestra aplicación se llama MiAplicacion.exe y que en nuestro sistema tenemos instalada la versión 10 del IE. Para que en nuestra aplicación el TWebBrowser muestre las páginas web como en nuestro IE 10, tendremos que añadir la siguiente entrada, de tipo DWORD, en el registro de Windows:
HKEY_CURRENT_USER SOFTWARE Microsoft Internet Explorer Main FeatureControl FEATURE_BROWSER_EMULATION MiAplicacion.exe = (DWORD) 00010000
Podemos ponerlo también en el HKEY_LOCAL_MACHINE
, aunque preferiblemente en el indicado anteriormente.
En la MSDN de Microsoft tenemos la lista de todos los posibles valores para cada una de las distintas versiones de IE.
Y cómo podemos saber la versión de nuestro IE instalado para así saber qué valor poner en el registro? Pues con una sencilla búsqueda en Google podemos obtener un código como el que sigue (código sacado de stackoverflow)
function GetIEVersion: string; var Reg: TRegistry; begin Result := ''; Reg := TRegistry.Create; try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKeyReadOnly('Software\Microsoft\Internet Explorer') then try Result := Reg.ReadString('Version'); finally Reg.CloseKey; end; finally Reg.Free; end; if Result = '' then Result := '0'; end;
Ahora que tenemos la forma de obtener la versión de IE, ya sabemos qué valor poner en el registro de Windows, por lo que ya podremos visualizar cualquier página en nuestro TWebBrowser como si del propio IE se tratara.
Saludos
Interesante artículo Xavier.
Más de una vez me ha pasado (que te salgan errores raros en una página del WebBrowser) e imagino que esta debe ser la solución.
Comportamientos del WebBrowser que hasta ahora eran «misterios sin resolver»… 😉
Un saludo.
Gracias Germán
En mi caso, gracias a la GMLib y el nuevo componente que estoy diseñando para ella, en TGMHeatMap, que si no, ni me hubiera planteado solucionar el problema. No hay nada como preguntar a los que saben 🙂
San «stackoverflow» siempre al rescate, yo lo descubrí con los cursos de java.
Por cierto, buen artículo (^_^)
Muchas gracias Roberto! Un placer verte por aquí 🙂
Muy interesante. Me lo apunto.
Muchas gracias Domingo 🙂
Una pregunta un poco tonta, el valor que nos devuelve la funcion es el que tenemos que poner en la entrada del registro nueva? o hay que hacerle la convercion segun la version que sea?
Muchas Gracias.
Un saludo.
Hola Nompa10
No, a ver, la función GetIEVersion te devuelve la versión de tu Internet Explorer. Con esta versión (es un string estilo 8.0.6001.18702 por lo que tendrás que jugar con él) puedes montar un case para saber el valor a poner en el registro con el nombre de tu aplicación. Los posibles valores, como digo en la entrada, los puedes ver aquí.
Saludos!
Me parecía que era de esa manera, pero tenía dudas.
Muchas Gracias!
Muchas gracias por esto muy interesante artículo. Siempre me sorprende por el extraño comportamiento del TWebBrowser, aunque supuso que esto se debe a la versión del IE.
Gracias Iskander.
Thanks Iskander.
Aunque el artículo es antiguo, me ha servido de mucho. Hoy en día es muy común usar un webbrowser para el proceso OAuth para iniciar sesión en Twitter, Facebook, Dropbox, etc. y sin este «truco» muchos procesos de login dan error o muestran mal la página de acceso.