2010-03-15 16 views
6

¿Hay alguna manera de detectar qué tema de Windows XP está en uso?javascript: detectar si XP o el tema clásico de Windows está habilitado

Sospecho que no hay una llamada api específica que pueda hacer, pero puede averiguarlo marcando algo en algún elemento DOM, es decir, detección de características.

Otra pregunta: ¿existe el tema clásico incluso en Windows Vista o Windows 7?

edición - este es mi solución:

function isXpTheme() { 
    var rgb; 
    var map = { "rgb(212,208,200)" : false, 
       "rgb(236,233,216)" : true }; 
    var $elem = $("<button>"); 
    $elem.css("backgroundColor", "ButtonFace"); 
    $("body").append($elem); 
    var elem = $elem.get(0); 
    if (document.defaultView && document.defaultView.getComputedStyle) { 
    s = document.defaultView.getComputedStyle(elem, ""); 
    rgb = s && s.getPropertyValue("background-color"); 
    } else if (elem.currentStyle) { 
    rgb = (function (el) { // get a rgb based color on IE 
    var oRG =document.body.createTextRange(); 
    oRG.moveToElementText(el); 
    var iClr=oRG.queryCommandValue("BackColor"); 
     return "rgb("+(iClr & 0xFF)+","+((iClr & 0xFF00)>>8)+","+ 
        ((iClr & 0xFF0000)>>16)+")"; 
    })(elem); 
    } else if (elem.style["backgroundColor"]) { 
    rgb = elem.style["backgroundColor"]; 
    } else { 
    rgb = null; 
    } 
    $elem.remove(); 
    rgb = rgb.replace(/[ ]+/g,"") 
    if(rgb){; 
    return map[rgb]; 
    } 
} 

El siguiente paso es averiguar lo que esta función devuelve en máquinas que no son XP y/o encontrar la manera de detectar las cajas de ventanas. He probado esto solo en Windows XP, por lo que vista y Windows 7 pueden dar diferentes valores de color, sin embargo, debería ser fácil de agregar.

Aquí es una página de prueba de esto en acción:

http://programmingdrunk.com/current-projects/isXpTheme/

+2

Sí, el tema clásico aún existe en las versiones recientes de Windows. Sin embargo, dudo mucho de que el tema en uso sea algo que una página web pueda saber. Si hubiera un método, creo que los anuncios emergentes que parecen una ventana de Windows XP habrían usado el estilo correcto hace años ;-) – Joey

+0

¡Muy bien, mkoryak! Resultados de la prueba en Win XP Service Pack 3 en una VM: Firefox 3.5 detecta ambos correctamente; IE6 no puede decir nada (pero creo que era de esperar). –

+0

@Pekka: en realidad fue una tonta supervisión de mi parte lo que hizo que IE6 no funcionara. Lo arreglé y ahora IE6 funciona =) – mkoryak

Respuesta

6

pregunta interesante. Lo único que viene a la mente es verificar el tamaño de un botón predeterminado. Tiene un estilo diferente en ambos temas, y supongo que tiene un tamaño diferente. Esto podría ser a mitad de camino confiable si le da al botón un tamaño de texto fijo.

Voy a iniciar la máquina virtual XP y verifico si los tamaños realmente difieren.

Actualización: Difieren.

Google "Voy a tener suerte" botón

  • en la piel clásica: (sic) 99 x 23.75 los píxeles
  • en XP de la piel: 97 x 21.75 píxeles

Una segunda , un enfoque menos confiable que viene a la mente es dar un elemento a CSS system colour y luego analizar el color calculado resultante. En el modo clásico, la propiedad ButtonFace tendrá un tono de gris específico y I piensa que es diferente en el aspecto predeterminado. Nuevamente, tendría que ser probado.

Actualización: difieren también.

ButtonFace de colores del sistema CSS

  • en la piel clásico de Windows: # D4D0C8
  • en la piel XP: # ECE9D8

Obviamente, ambos enfoques se romperá si el usuario hizo ninguna personalización de colores y/o tamaños de fuente. El enfoque del tamaño de fuente es la OMI más confiable, ya que hay menos personas jugando con eso.

Por supuesto, debe tener tablas de comparación para todas las generaciones de Windows, ya que, presumiblemente, los valores para la máscara clásica y predeterminada serán diferentes.

+0

Creo que la manera menos confiable puede ser más confiable, ya que el botón ya puede estar diseñado por CSS, por lo que cuando lo crea, no obtendrá el tamaño predeterminado. Lo intentaré en ambos sentidos. – mkoryak

+0

@mkoryak Agregué los resultados de mi prueba. –

+0

@mkoryak si fuerza un 'font-size' en un botón específico y restablece todos los demás atributos (altura, relleno, etc.), debería poder obtener resultados fiables, creo. Sin embargo, tendrías que resetear mucho para estar seguro. –

-1

solo para dar un punto de partida para IsThemeActive()

+0

err, eso se parece a C++. Estaba hablando de javascript aquí. – mkoryak

Cuestiones relacionadas