65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 uxtheme.dll 和 SetWindowTheme 禁用 Windows 主题

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.45/5 (6投票s)

2008年5月29日

CPOL

2分钟阅读

viewsIcon

68567

downloadIcon

1154

如何禁用 Windows 主题,以确保在所有版本的 Windows 上应用程序外观统一。

DisableWindowsThemesExample

引言

本文档解释了如何在 .NET 应用程序中禁用 Windows 主题,以确保在所有版本的 Windows 上外观统一。

背景

几个月前,我注意到 Windows 会根据用户 PC 上当前活动的 Windows 主题,以不同的方式绘制窗体和控件。

这不仅仅是不同的窗口样式或状态栏,而是实际绘制的颜色不同。例如,Color.Silver 在 Windows XP 主题中看起来比在 Windows Classic 中浅得多。在 Windows Vista 下,Color.Silver 几乎是白色。有些颜色在 Vista 下完全消失,并被绘制为白色。

因此,我开始寻找一种在 .NET 应用程序中关闭 Windows 主题的方法,以便无论开发人员和用户的 PC 如何,都能获得更统一的外观。

使用代码

为了禁用 Windows 主题,实际上需要引用 Windows API DLL uxtheme.dll 并将主题设置为无。我没有找到更简单的方法来做到这一点。似乎没有在应用程序或窗体级别公开的属性可以让你禁用主题。

为了使这个过程更容易,并避免在应用程序中的所有窗体中粘贴相同的代码,我创建了一个包含必要代码的基础窗体。

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace DisableWindowsThemesExample
{
    public class BaseForm : Form
    {
        [DllImport("uxtheme", ExactSpelling = true, CharSet = CharSet.Unicode)]
        public extern static Int32 SetWindowTheme (IntPtr hWnd, 
                      String textSubAppName, String textSubIdList);

        public BaseForm()
        {
            SetWindowTheme(Handle, "", "");
            Invalidate();
        }
    }
}

然后,你只需从基础窗体继承你的窗体,并调用基础构造函数。(调用基础构造函数实际上是不必要的,因为它是不言而喻的。)

public partial class ExampleForm : BaseForm
{
    public ExampleForm(): base()
    {

此外,为了禁用控件的主题,你必须将控件的 FlatSyle 设置为 System 并为该控件调用 SetWindowTheme

rdoNonThemed.FlatStyle = FlatStyle.System; 
grpNonThemed.FlatStyle = FlatStyle.System;
btnNonThemed.FlatStyle = FlatStyle.System;
SetWindowTheme(grpNonThemed.Handle, "", "");
SetWindowTheme(rdoNonThemed.Handle, "", "");
SetWindowTheme(btnNonThemed.Handle, "", ""); 

下载上面的解决方案以查看一个可用的示例。

历史

  • 2008-05-28 - 初始版本,修复了下载链接。
© . All rights reserved.