How to detect Windows 10 light/dark mode in Win32 application? How to detect Windows 10 light/dark mode in Win32 application? windows windows

How to detect Windows 10 light/dark mode in Win32 application?


Well, it looks like this option is not exposed to regular Win32 applications directly, however it can be set / retrieved through the AppsUseLightTheme key at the HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize registry path.


EDIT: Calling out that this works in all Win32 projects as long as you're building with c++17 enabled.

If you're using the latest SDK, this worked for me.

#include <winrt/Windows.UI.ViewManagement.h>using namespace winrt::Windows::UI::ViewManagement;if (RUNNING_ON_WINDOWS_10) {  UISettings settings;  auto background = settings.GetColorValue(UIColorType::Background);  auto foreground = settings.GetColorValue(UIColorType::Foreground);}


The Microsoft.Windows.SDK.Contracts NuGet package gives .NET Framework 4.5+ and .NET Core 3.0+ applications access to Windows 10 WinRT APIs, including Windows.UI.ViewManagement.Settings mentioned in the answer by jarjar. With this package added to a .NET Core 3.0 console app that consists of this code:

using System;using Windows.UI.ViewManagement;namespace WhatColourAmI{    class Program    {        static void Main(string[] args)        {            var settings = new UISettings();            var foreground = settings.GetColorValue(UIColorType.Foreground);            var background = settings.GetColorValue(UIColorType.Background);            Console.WriteLine($"Foreground {foreground} Background {background}");        }    }}

The output when the theme is set to Dark is:

Foreground #FFFFFFFF Background #FF000000

When the theme is set to Light it's:

Foreground #FF000000 Background #FFFFFFFF

As this is exposed via a Microsoft provided package that states:

This package includes all the supported Windows Runtime APIs up to Windows 10 version 1903

It's a pretty safe bet that it's intentional that this API is accessible!

Note: This isn't explicitly checking whether the theme is Light or Dark but checking for a pair of values that suggest that the theme in use is one of the two, so,.. the correctness of this method is mildly questionable but it's at least a "pure" C# way of achieving what's been outlined elsewhere with C++