.Net - 检测外观设置(经典还是 XP?)

Posted

技术标签:

【中文标题】.Net - 检测外观设置(经典还是 XP?)【英文标题】:.Net - Detecting the Appearance Setting (Classic or XP?) 【发布时间】:2010-09-07 06:37:19 【问题描述】:

我有一些在 VB 2005 中的 UI,在 XP 风格中看起来很棒,但在经典风格中变得丑陋。

关于如何检测用户处于哪种模式并即时重新格式化表单的任何想法?


发布答案编辑:

谢谢丹尼尔,看来这会奏效。我正在使用您使用 GetCurrentThemeName() 函数发布的第一个解决方案。

我正在做以下事情:

函数声明:

 Private Declare Unicode Function GetCurrentThemeName Lib "uxtheme" (ByVal stringThemeName As System.Text.StringBuilder, ByVal lengthThemeName As Integer, ByVal stringColorName As System.Text.StringBuilder, ByVal lengthColorName As Integer, ByVal stringSizeName As System.Text.StringBuilder, ByVal lengthSizeName As Integer) As Int32

代码正文:


Dim stringThemeName As New System.Text.StringBuilder(260)
Dim stringColorName As New System.Text.StringBuilder(260)
Dim stringSizeName As New System.Text.StringBuilder(260)

GetCurrentThemeName(stringThemeName, 260, stringColorName, 260, stringSizeName, 260) MsgBox(stringThemeName.ToString)

当我使用 Windows 经典风格/主题时,MessageBox 显示为空,如果是 Windows XP 风格/主题,则显示“C:\WINDOWS\resources\Themes\luna\luna.msstyles”。如果用户设置的主题不是这两个主题,我将不得不做更多检查,看看会发生什么,但这应该不是什么大问题。

【问题讨论】:

【参考方案1】:

尝试结合使用GetCurrentThemeName (MSDN Page) 和DwmIsCompositionEnabled

我将第一个链接到 PInvoke,因此您可以将其放入您的代码中,对于第二个,您可以使用 MSDN 注释中提供的代码:

[DllImport("dwmapi.dll", PreserveSig = false)]
public static extern bool DwmIsCompositionEnabled();

看看你从这两个函数中得到了什么结果;它们应该足以确定您何时要使用不同的主题!

【讨论】:

【参考方案2】:

就我个人而言,我使用以下来查看应用是否在主题下运行:

if (Application.RenderWithVisualStyles)

    // you're themed

【讨论】:

【参考方案3】:

有IsThemeActive WinAPI 函数。

【讨论】:

以上是关于.Net - 检测外观设置(经典还是 XP?)的主要内容,如果未能解决你的问题,请参考以下文章

如何在VirtualBox虚拟机中安装XP系统? 转

Windows系统

下的XP 的主题. 用了出不了完全的效果啊.

检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为经典模式)。 - CatcherX

时序图与状态图(Rose) - Windows XP经典软件系列

如何设置 Windows 窗体标题栏和 UI 使用 Windows 8/10 的平面操作系统主题,而不是 XP/7 纹理外观?