65.9K
CodeProject 正在变化。 阅读更多。
Home

检测 XP 主题

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (6投票s)

2004年3月19日

2分钟阅读

viewsIcon

88509

downloadIcon

2

如何检测 Windows XP 中的主题设置

Sample image

引言

众所周知,对 XP 主题的支持有些不稳定——例如,资源管理器会绕过主题 DLL UxTheme。微软拒绝向开发者开放主题,担心大量新的主题会导致“应用程序不兼容”。

我选择不修改 UxTheme 等,但希望我的应用程序能够感知主题是否在使用。由于至少目前只有四种主题,编写代码来响应用户的选择是可行的。用户可以选择“Windows 经典”或“Windows XP”。如果他们选择后者,可以选择蓝色(默认)、橄榄绿或银色配色方案。

[添加]

感谢 Konrad Windszus 和 Rene Koenig,他们指出窥探注册表是不稳定的,并且可能在未来的版本中失效。这是一个重要的免责声明,以及以下说明:不要修改注册表以尝试更改主题。

我修改了代码,以说明 Konrad 建议调用 UxTheme 的 IsThemeActive() 方法,以及 Rene 的 IsAppThemed() 方法。我仍然找不到一种简单的方法让 UxTheme 告诉我用户是否选择了蓝色、绿色或银色。

使用注册表

答案可以在注册表中找到,但并不明显。为了避免您进行实验,我直接告诉您

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ThemeManager

如果使用 Windows XP,则 ThemeActive 为“1”,如果使用 Windows 经典,则为“0”。

如果 ThemeActive 为“1”,ColorName 将为蓝色“NormalColor”,橄榄绿“HomeStead”,或银色“Metallic”。(顺便说一句,所有这些数据值都是 REG_SZ 类型,或者字符串。)

以下 C# 代码说明了读取设置。其他语言也大致相似。

using System;
using System.Runtime.InteropServices;
using Microsoft.Win32;
class Class1 { 
static void Main()

{
    Console.WriteLine("CurrentTheme returns {0}", CurrentTheme());
    Console.WriteLine("UxTheme::IsThemeActive returns {0}", IsThemeActive());
    Console.WriteLine("UxTheme::IsAppThemed returns {0}", IsAppThemed());
    Console.Read();

}
public enum Theme

{
    WindowsClassic,
    XPBlue,
    XPGreen,
    XPSilver

}
public static Theme CurrentTheme()

{
    RegistryKey key = 
        Registry.CurrentUser.OpenSubKey(
            @"Software\Microsoft\Windows\CurrentVersion\ThemeManager");
    if (key != null) 
    {
        if ("1" == (string) key.GetValue("ThemeActive"))
        {
            string s = (string) key.GetValue("ColorName");
            if (s != null)
            {
                if (String.Compare(s, "NormalColor", true) == 0)
                    return Theme.XPBlue;
                if (String.Compare(s, "HomeStead", true) == 0)
                    return Theme.XPGreen;
                if (String.Compare(s, "Metallic", true) == 0)
                    return Theme.XPSilver;
            }
        } 
    }
    return Theme.WindowsClassic;

}
[DllImport("UxTheme")]

static extern bool IsThemeActive();
[DllImport("UxTheme")]

static extern bool IsAppThemed();
}    // end Class1

参考文献

这篇文章的灵感来自于 CodeProject 上一篇关于 XP 风格按钮的匿名文章:https://codeproject.org.cn/cs/miscctrl/JPEnhancedXPButton.asp,该文章基于一位名为 Joaqs 的人的工作。匿名文章添加了一个“BtnStyle”属性,供程序员指定蓝色、银色或橄榄色,但没有提供任何关于如何检测当前状态的提示。

历史

  • 03/21/04 ad 修改
  • 03/19/04 ad 初始
© . All rights reserved.