web-dev-qa-db-fra.com

Comment détecter le mode clair / sombre de Windows 10 dans l'application Win32?

Un peu de contexte: Sciter (application win32 pure) est déjà capable de restituer des interfaces utilisateur UWP semblables:

en mode sombre: in dark mode

en mode lumière: in light mode

Windows 10.1803 introduit le commutateur Dark/Light dans l'applet Paramètres comme on le voit ici par exemple .

Question: comment déterminer le type actuel de ce "mode d'application" dans l'application Win32?

18
c-smile

Eh bien, il semble que cette option ne soit pas directement exposée aux applications Win32 standard, mais elle peut être définie/récupérée via HKCU (HKLM) \Software\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme clé d'enregistrement.

17
VTT

EDIT: rappelant que cela fonctionne dans tous les projets Win32 tant que vous construisez avec c ++ 17 activé.

Si vous utilisez le dernier SDK, cela a fonctionné pour moi.

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

Le Microsoft.Windows.SDK.Contracts Le package NuGet permet aux applications .NET Framework 4.5+ et .NET Core 3.0+ d'accéder aux API WinRT de Windows 10, y compris Windows.UI.ViewManagement.Settings mentionné dans la réponse de jarjar . Avec ce package ajouté à une application console .NET Core 3.0 composée de ce 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}");
        }
    }
}

La sortie lorsque le thème est défini sur Dark est:

Premier plan #FF [~ # ~] ffffff [~ # ~] Arrière-plan #FF 000000

Lorsque le thème est défini sur Light c'est:

Premier plan #FF 000000 Arrière-plan #FF [~ # ~] ffffff [~ # ~]

Comme cela est exposé via un package fourni par Microsoft qui indique:

Ce package comprend toutes les API Windows Runtime prises en charge jusqu'à Windows 10 version 1903

Il y a fort à parier qu'il est intentionnel que cette API soit accessible!

Remarque: Cela ne vérifie pas explicitement si le thème est Clair ou Sombre = mais en vérifiant une paire de valeurs qui suggère que le thème utilisé est l'un des deux, donc, .. l'exactitude de cette méthode est légèrement discutable mais c'est au moins une "pure" C # façon de réaliser ce qui a été décrit ailleurs avec C++

2
Rob