javascript:检测是否启用了XP或Classic Windows主题

时间:2010-03-15 20:10:22

标签: javascript windows browser-feature-detection

有没有办法检测哪些Windows XP主题正在使用?

我怀疑你没有特定的api调用,但是你可以通过检查一些DOM元素,即特征检测来解决这个问题。

另一个问题:经典主题是否甚至存在于Windows Vista或Windows 7上?

编辑 - 这是我的解决方案:

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];
  }
}

下一步是弄清楚此函数在非xp机器上返回的内容和/或弄清楚如何检测窗口框。我只在Windows XP中测试了这个,所以vista和windows 7可能会给出不同的颜色值,但它应该很容易添加。

以下是此操作的演示页面:

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

2 个答案:

答案 0 :(得分:6)

有趣的问题。我唯一想到的是检查默认按钮的大小。它在两个主题中的风格不同,我想它有不同的大小。如果您为按钮指定固定的文本大小,这可能是中途可靠的。

我将启动XP虚拟机并检查尺寸是否实际不同。

更新:他们确实有所不同。

谷歌“我感觉很幸运”按钮

  • in classic skin:99 x 23.75(sic!)pixels
  • XP皮肤中的
  • :97 x 21.75像素

首先想到的第二种不太可靠的方法是给元素CSS system colour,然后解析生成的计算颜色。在经典模式下,ButtonFace属性将具有特定的灰色阴影,并且我认为在默认皮肤中具有不同的颜色。再次,必须进行测试。

更新:他们也有所不同。

ButtonFace CSS系统颜色

    Windows经典皮肤中的
  • :#D4D0C8
  • XP皮肤中的
  • :#ECE9D8

显然,如果用户对颜色和/或字体大小进行任何自定义,这两种方法都会中断。字体大小方法是更可靠的IMO,因为玩弄它的人越来越少。

当然,您必须拥有所有Windows代的比较表,因为可能,经典和默认外观的值会有所不同。

答案 1 :(得分:-1)

只是为了一个起点来寻找IsThemeActive()