【问题标题】:How to get the Windows 7 theme name如何获取 Windows 7 主题名称
【发布时间】: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 mentionedGetThemeDocumentationProperty() 似乎做你想做的事。

标签: c# winapi


【解决方案1】:

查看 MSDN 文档后,GetThemeDocumentationProperty 可能就是您要查找的内容。

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

此外,这里有一个站点,其中包含用于 p/invoke 调用的 c# 方法包装器:http://www.java2s.com/Open-Source/CSharp/2.6.4-mono-.net-core/System.Windows.Forms/System/Windows/Forms/VisualStyles/UXTheme.cs.htm

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2011-09-18
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多