JavaScript:检测XP或经典Windows主题是否启用

6

有没有办法检测正在使用的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系统。我仅在Windows XP中进行了测试,因此vista和Windows 7可能会给出不同的颜色值,但很容易添加。

以下是此功能的演示页面:

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


2
是的,经典主题仍然存在于最近的Windows版本中。但我严重怀疑正在使用的主题是否是网页可以知道的。如果有一种方法,我认为看起来像Windows XP窗口的弹出广告早在多年前就会使用正确的样式了;-) - Joey
太棒了,mkoryak!在虚拟机中使用Win XP Service pack 3测试的结果是:Firefox 3.5可以正确检测,而IE6则无法检测(但我认为这是意料之中的)。 - Pekka
@Pekka:其实这是我的一个愚蠢疏忽导致IE6无法工作。我已经修复了,现在IE6可以正常工作了=) - mkoryak
2个回答

6
有趣的问题。我想到的唯一一件事就是检查默认按钮的大小。它在两个主题中的样式不同,我想它的大小也不同。如果您给按钮一个固定的文本大小,这可能是半可靠的。
我将启动XP虚拟机并检查大小是否实际上不同。
更新:它们确实不同。
谷歌“我感觉很幸运”按钮
- 在经典皮肤中:99 x 23.75(sic!)像素 - 在XP皮肤中:97 x 21.75像素
我想到的第二种不太可靠的方法是给元素CSS系统颜色,然后解析生成的计算颜色。在经典模式下,ButtonFace属性将具有特定的灰色阴影,而我认为在默认皮肤中会有不同的阴影。同样,需要进行测试。
更新:它们也不同。
ButtonFace CSS系统颜色
  • 在Windows经典皮肤中:#D4D0C8
  • 在XP皮肤中:#ECE9D8

显然,如果用户自定义了颜色和/或字体大小,则这两种方法都会失效。在我看来,字体大小的方法更可靠,因为玩弄它的人较少。

当然,您必须为所有Windows代数准备比较表,因为经典和默认皮肤的值可能会有所不同。


我认为不太可靠的方法可能更可靠,因为按钮可能已经被CSS样式化了,所以当你创建它时,你将不会得到默认大小。不过我会尝试两种方法。 - mkoryak
@mkoryak 我添加了我的测试结果。 - Pekka
@mkoryak 如果你在特定按钮上强制设置了 font-size 并重置了所有其他属性(高度、内边距等),我认为你应该能够获得可靠的结果。不过,为了确保,你可能需要重置很多东西。 - Pekka
@mkoryak 这里有一个跨浏览器运行良好的 getComputedStyle 函数,应该可以使用:https://dev59.com/-XI-5IYBdhLWcg3wPFt2 - Pekka
是的,这太糟糕了。我想我会尝试使用按钮方法,并首先重置所有与大小相关的CSS样式。无论如何,感谢您的帮助,您让我找到了正确的方向。 - mkoryak
显示剩余5条评论

-1

只是为了给一个起点,可以查找IsThemeActive()函数


错误,那看起来像是C++,我在谈论JavaScript。 - mkoryak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接