检测 XP 主题






3.50/5 (6投票s)
2004年3月19日
2分钟阅读

88509

2
如何检测 Windows XP 中的主题设置
引言
众所周知,对 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 初始