jun 112014
 

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

  12 Responses to “Cosas del TWebBrowser”

  1. 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.

  2. San “stackoverflow” siempre al rescate, yo lo descubrí con los cursos de java.
    Por cierto, buen artículo (^_^)

  3. Muy interesante. Me lo apunto.

  4. 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.

  5. 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.

  6. 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.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)