Post

[How To] Check to see if Visual Styles are enabled

After my rant and a some other people picking it up on their blog, I got a response from Raghavendra Prabhu who is part of the .NET Client Team letting us know that VisualStyles in Whidbey has a ton of improvements and resolves the issues I point out and pointed out that using EnableVisualStyles, although has bugs, can be used as long as you do a Application.DoEvents prior to Application.Run(). For more information, please read his entry on the subject (it’s a great read if your doing anything with visual styles in your application).. In the comments of my rant, he suggested that I use GetDllVersion API in addition to the methods I’m already using to find out if visual styles are enabled. After doing some more digging in API land, I’ve modified the previous code so that you can reuse it to determine whether the application you are running is using visual styles or not. Thanks to everyone that provided feedback on this to get a solution. Here’s the code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Private Structure DLLVERSIONINFO
  Public cbSize As Integer
  Public dwMajorVersion As Integer
  Public dwMinorVersion As Integer
  Public dwBuildNumber As Integer
  Public dwPlatformID As Integer
End Structure

Private Declare Function DllGetVersion Lib "comctl32.dll" (ByRef version As DLLVERSIONINFO) As Integer
Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal path As String) As IntPtr
Private Declare Function GetProcAddress Lib "kernel32.dll" (ByVal library As IntPtr, ByVal procName As String) As IntPtr
Private Declare Function FreeLibrary Lib "kernel32.dll" (ByVal library As IntPtr) As Boolean
Private Declare Function IsThemeActive Lib "uxtheme.dll" () As Boolean
Private Declare Function IsAppThemed Lib "uxtheme.dll" () As Boolean

Private Function IsVisualStylesEnabled() As Boolean

  Dim os As OperatingSystem = System.Environment.OSVersion

  If os.Platform = PlatformID.Win32NT AndAlso (((os.Version.Major = 5) And (os.Version.Minor >= 1)) Or (os.Version.Major > 5)) Then
    Dim uxTheme As IntPtr = LoadLibrary("uxtheme.dll")
    If Not uxTheme.Equals(IntPtr.Zero) Then
      Dim handle As IntPtr = GetProcAddress(uxTheme, "IsThemeActive")
      If handle.Equals(IntPtr.Zero) Then
        ' an error occured, use GetLastError
      Else
        If IsThemeActive() AndAlso IsAppThemed Then
          Dim version As DLLVERSIONINFO
          version.cbSize = Len(version)
          If DllGetVersion(version) = 0 Then
            If version.dwMajorVersion > 5 Then
              Return True
            End If
          End If
        End If
      End If
    Else
      ' an error occured, use GetLastError
    End If

    FreeLibrary(uxTheme)

  End If

  Return False

End Function

’ Updated version of above function - see here for more details.

1
2
3
4
5
6
7
8
9
10
11
Private Function IsVisualStylesEnabledRevisited() As Boolean
  Dim os As OperatingSystem = System.Environment.OSVersion
  If os.Platform = PlatformID.Win32NT AndAlso (((os.Version.Major = 5) And (os.Version.Minor >= 1)) Or (os.Version.Major > 5)) Then
    Dim version As New DLLVERSIONINFO
    version.cbSize = Len(version)
    If DllGetVersion(version) = 0 Then
      Return (version.dwMajorVersion > 5) AndAlso IsThemeActive() AndAlso IsAppThemed()
    End If
  End If
  Return False
End Function

Man, what a lot of work just to find out what should be a simple answer to an extremely simple question. Now, if you are writing visual components and want to determine if you need to render one way or another depending on the usage of visual styles, now you can determine whether you are or not. ;-)

UPDATE: Added a new version of the IsVisualStylesEnabled method based on additional information and testing.

This post is licensed under CC BY 4.0 by the author.