2011-07-09 79 views
5

Windows 7带有几个内置主题。可以通过右键单击桌面并选择“个性化”来访问它们。在Personalize下,有一个名为“Aero Themes”的部分,其中包含“Architecture”,“Nature”等主题。如何获取Windows 7主题名称

我试着用的uxtheme.dll的GetCurrentThemeName,但它实际上是给样式名称: “C:\ WINDOWS \资源\主题\航空\ Aero.msstyles”除非我的当前主题设置为Windows基础,在这种情况下,它返回一个空字符串。有没有实际返回主题名称的API,如“自然”“建筑”等...?

我尝试的代码如下:

[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); 
+1

我发现了一个注册表项:HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Themes其中包含一个条目:“CurrentTheme”,其中填充了主题文件名,而不是主题视觉样式,如我原始提到的错误提及的API帖子。例如,对于自然主题,它的价值是:“C:\ Windows \ resources \ Themes \ nature.theme”,这对我来说是非常好的解析并获得名称。当然,如果主题的文件名与UI中的实际主题显示名称不匹配,则会出现问题,但在有限的情况下,我绝不会遇到这种情况。 – user577240

+1

因为它比实现更多的是实现细节,所以它通常不是一个好主意。正如[布莱恩Dishaw提到](http://stackoverflow.com/questions/6631796/how-to-get-the-windows-7-theme-name/6632887#6632887),['GetThemeDocumentationProperty()'](http ://msdn.microsoft.com/en-us/library/bb773402.aspx)似乎做你想做的。 –

+0

谢谢你们。而已。 – user577240

回答

2

考虑看看MSDN文档看起来GetThemeDocumentationProperty可能是你在找什么后。

您需要将它与主题文件(您在注册表中找到的主题文件)一起使用,并将SZ_THDOCPROP_DISPLAYNAME作为方法的第二个参数传递。

另外这里是具有用于p C#的方法包装一个网站/调用电话:http://www.java2s.com/Open-Source/CSharp/2.6.4-mono-.net-core/System.Windows.Forms/System/Windows/Forms/VisualStyles/UXTheme.cs.htm

希望有所帮助。