Как определить режим Windows/Light/Dark в приложении Win32?

Немного контекста: Sciter (чистое приложение win32) уже способно отображать UWP как пользовательские интерфейсы:

в темном режиме: in dark mode

в режиме освещения: in light mode

Windows 10.1803 представляет переключатель темных/светлых в апплетах настроек, как показано здесь, например.

Вопрос: как определить текущий тип этого "режима приложения" в приложении Win32?

Ответы

Ответ 1

Что ж, похоже, эта опция не предоставляется обычным приложениям Win32 напрямую, однако ее можно установить/получить с помощью клавиши AppsUseLightTheme в пути к реестру HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize.

Ответ 2

РЕДАКТИРОВАТЬ: Вызывая, что это работает во всех проектах Win32, пока вы строите с включенным С++ 17.

Если вы используете последний SDK, это сработало для меня.

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

Ответ 3

Пакет Microsoft.Windows.SDK.Contracts NuGet предоставляет приложениям .NET Framework 4. 5+ и .NET Core 3. 0+ доступ к Windows 10 WinRT API, включая Windows.UI.ViewManagement.Settings упомянутые в ответе jarjar., С этим пакетом, добавленным в консольное приложение .NET Core 3.0, которое состоит из этого кода:

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

Вывод, когда тема установлена на Dark:

Передний план #FF FFFFFF Фон #FF 000000

Когда тема установлена на Light, это:

Передний план #FF 000000 Фон #FF FFFFFF

Поскольку это выставлено через предоставленный Microsoft пакет, который заявляет:

Этот пакет включает в себя все поддерживаемые API среды выполнения Windows до Windows 10 версии 1903

Довольно уверенно, что этот API преднамеренно доступен!

Примечание: Это не проверка явно, является ли тема Светлой или Темной, но проверка пары значений, которые предполагают, что используемая тема является одной из двух, так что... правильность этого метода слегка сомнительна, но это в по крайней мере, "чистый" С# способ достижения того, что было обрисовано в общих чертах с C++