6

どのWindowsXPテーマが使用されているかを検出する方法はありますか?

特定のAPI呼び出しを行うことはできないと思いますが、いくつかのDOM要素、つまり機能の検出をチェックすることで、それを理解できる可能性があります。

別の質問:クラシックテーマはWindowsVistaまたはWindows7にも存在しますか?

編集-これは私の解決策です:

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ボックスを検出する方法を理解することです。私はこれをWindowsXPでのみテストしたので、vistaとwindows 7は異なる色の値を与える可能性がありますが、簡単に追加できるはずです。

これが実際のデモページです。

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

4

2 に答える 2

6

興味深い質問です。頭に浮かぶのは、デフォルトのボタンのサイズを確認することだけです。どちらのテーマでもスタイルが異なり、サイズも違うと思います。ボタンに固定のテキストサイズを指定すると、これは中途半端な信頼性になる可能性があります。

XP仮想マシンを起動し、サイズが実際に異なるかどうかを確認します。

更新:それらは異なります。

グーグル「ラッキーだ」ボタン

  • クラシックスキンの場合:99 x 23.75(sic!)ピクセル
  • XPスキンの場合:97x21.75ピクセル

頭に浮かぶ2つ目の、信頼性の低いアプローチは、要素にCSSシステムの色を付けてから、計算された色を解析することです。クラシックモードでは、ButtonFaceプロパティは特定のグレーの色合いになり、デフォルトのスキンでは別の色合いになると思います。繰り返しますが、テストする必要があります。

更新:それらも異なります。

ButtonFaceCSSシステムの色

  • Windowsクラシックスキンの場合:#D4D0C8
  • XPスキンの場合:#ECE9D8

明らかに、ユーザーが色やフォントサイズをカスタマイズした場合、両方のアプローチが機能しなくなります。フォントサイズのアプローチは、それで遊んでいる人が少ないので、より信頼性の高いIMOです。

もちろん、すべてのWindows世代の比較テーブルが必要です。おそらく、クラシックスキンとデフォルトスキンの値は異なるためです。

于 2010-03-15T20:15:20.597 に答える
-1

IsThemeActive()の開始点を探すためだけに

于 2010-03-21T20:50:06.220 に答える