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






3.45/5 (6投票s)
如何禁用 Windows 主题,以确保在所有版本的 Windows 上应用程序外观统一。
引言
本文档解释了如何在 .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 - 初始版本,修复了下载链接。