【发布时间】:2011-07-09 13:11:08
【问题描述】:
Windows 7 带有多个内置主题。可以通过右键单击桌面并选择个性化来访问它们。在 Personalize 下,有一个名为“Aero Themes”的部分,其中包含“Architecture”“Nature”等主题。
我尝试使用 uxtheme.dll 的 GetCurrentThemeName,但它实际上给出了样式名称: "C:\Windows\resources\Themes\Aero\Aero.msstyles" 除非我当前的主题设置为 Windows Basic,在这种情况下它返回一个空字符串。是否有 API 可以实际返回主题名称,例如“Nature”“Architecture”等...?
我试过的代码如下:
[DllImport("uxtheme", ExactSpelling = true, CharSet = CharSet.Unicode)]
public extern static Int32 GetCurrentThemeName(StringBuilder stringThemeName,
int lengthThemeName, StringBuilder stringColorName, int lengthColorName,
StringBuilder stringSizeName, int lengthSizeName);
StringBuilder stringThemeName = new StringBuilder(260);
StringBuilder stringColorName = new StringBuilder(260);
StringBuilder stringSizeName = new StringBuilder(260);
Int32 s = GetCurrentThemeName(stringThemeName, 260,stringColorName, 260,stringSizeName, 260);
【问题讨论】:
-
我找到了一个注册表项:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes,其中包含一个条目:“CurrentTheme”,其中填充了主题文件名,而不是主题视觉样式,如 misnamed我的原始帖子中提到的 API。例如,对于自然主题,它获取的值是:“C:\Windows\resources\Themes\nature.theme”,这对我来说已经足够好解析它并获取名称了。当然,如果主题的文件名与 UI 中的实际主题显示名称不匹配,就会出现问题,但在我有限的场景中,我永远不会遇到这种情况。
-
潜伏在注册表周围通常不是一个好主意,因为它更多的是实现细节而不是其他任何东西。正如Brian Dishaw has mentioned,
GetThemeDocumentationProperty()似乎做你想做的事。