Click here to Skip to main content
Click here to Skip to main content

How to Disable Windows Themes Using uxtheme.dll and SetWindowTheme

By , 17 Jul 2008
 

DisableWindowsThemesExample

Introduction

This article explains how to disable Windows themes in a .NET application to ensure uniform appearance across all versions of Windows.

Background

A few months ago, it has come to my attention that Windows will paint forms and controls differently depending on the current Windows Theme that is active on the user's PC.

This does not end at a different window style or status bar, but actual colors painted differently. For example, Color.Silver will look much lighter in the Windows XP theme than it would in Windows Classic. Under Windows Vista, Color.Silver is almost white. Some colors disappear completely under Vista, and are painted as white.

So began my search for a way of turning off Windows themes in a .NET applications to allow for a more uniform look regardless of the developer's and the user’s PCs.

Using the code

In order to disable Windows themes, you actually need to reference a Windows API DLL uxtheme.dll and set the theme to nothing. I could not find an easier way to do this. There does not seem to by any property exposed on the application or form level that allows you to disable themes.

In order to make this process easier and to avoid pasting the same code in all of the forms in my application, I created a base form that contains the necessary code.

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();
        }
    }
}

Then, you simply inherit your form from the base form, and call the base constructor. (The call to the base constructor is actually not necessary since it is implicit.)

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

Furthermore, in order to disable themes for your controls, you have to set the FlatSyle of the control to System and call SetWindowTheme for that control.

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

Download the solution above to see a working example.

History

  • 2008-May-28 - Initial version, fixed download link.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Adam Berent
Canada Canada
Member

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralRule of ThumbmemberThe_Mega_ZZTer29 May '08 - 18:21 
QuestionRe: Rule of ThumbmemberAdam Berent30 May '08 - 3:28 
GeneralFixed Download Link.memberAdam Berent29 May '08 - 7:38 
GeneralDownload link brokenmember leppie 29 May '08 - 7:27 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 17 Jul 2008
Article Copyright 2008 by Adam Berent
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid