1
votes

Comment puis-je obtenir la couleur d'accentuation par défaut dans Windows 10?

J'ai une application et je souhaite définir sa couleur d'arrière-plan comme couleur par défaut Accent de Windows 10 et lorsque l'utilisateur change la couleur Accent de Windows 10, je veux également la couleur d'arrière-plan de mon application changements.

 entrez la description de l'image ici


2 commentaires

À partir de votre graphique, il semble que vous sélectionniez la couleur Accent dans la page des paramètres Couleurs et non la couleur d'arrière-plan dans la page Paramètres d'arrière-plan. Obtenir la couleur d'arrière-plan est facile, tandis que l'obtention de la couleur d'accent est plus complexe.


Oui, j'ai besoin d'une couleur d'accent


3 Réponses :


1
votes

Vous devrez appeler UISettings.GetColorValue (UIColorType.Background) comme indiqué ici .


1 commentaires

Ah, mais le simple fait de définir une couleur sur cette valeur ne la mettra pas à jour lorsque l'utilisateur change la couleur d'arrière-plan de Windows 10, donc cette réponse est incomplète



0
votes

Vous pouvez remplacer WndProc pour gérer le WM_SETTINGCHANGE message.
Lorsque ce message est reçu, vous pouvez déterminer si la modification des paramètres est liée à une modification du bureau inspectant le message WParam : s'il s'agit de SPI_SETDESKWALLPAPER , alors les paramètres du bureau ont changé.

Une modification de la couleur d'arrière-plan est notifiée comme ceci.
Lorsque vous recevez le message, la valeur de la couleur a déjà été modifiée afin que vous puissiez la récupérer en utilisant le SystemColors class: SystemColors.Desktop renvoie la couleur actuelle du bureau.

private const int WM_SETTINGCHANGE = 0x001A;
private const int SPI_SETDESKWALLPAPER = 0x0014;

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    switch (m.Msg) {
        case WM_SETTINGCHANGE:
            if (m.WParam.ToInt32() == SPI_SETDESKWALLPAPER) {
                this.BackColor = SystemColors.Desktop;
            }
            m.Result = IntPtr.Zero;
            break;
        // other case switches
} 


0 commentaires

1
votes

WinForms est une ancienne technologie qui n'a pas été beaucoup mise à jour pour prendre en charge les nouvelles fonctionnalités du système d'exploitation. Il n'y a pas de bon moyen d'obtenir la couleur Accent en utilisant les bibliothèques .Net de base (bien qu'il existe un hack basé sur le registre utilisant des clés non documentées pour récupérer la valeur). Heureusement, vous pouvez accéder à certaines API de Windows Runtime en ajoutant le package NUGET Microsoft .Windows.SDK.Contrats .

Avec ce package ajouté, vous pouvez créer une instance de Windows.UI.ViewManagement.UISettings Class , puis utilisez la Méthode UISettings.GetColorValue (UIColorType) pour récupérer la valeur.

Pour être informé des modifications de la valeur, vous pouvez vous abonner à la SystemEvents.UserPreferenceChanged, événement . Cet événement classe la modification en tant que UserPreferenceCategory Changement de type .General qui est la valeur par défaut lorsque l'ancienne logique ne sait pas ce qui a changé (encore une fois l'ancien code non mis à jour pour les nouvelles fonctionnalités). Vous pouvez détecter les modifications en écoutant le message WM_SETTINGCHANGE et vérifiez quand le WParam est nul et que le LParam pointe vers une chaîne ("ImmersiveColorSet"), mais cela répond au fait que la valeur de la chaîne ne change jamais et n'est pas beaucoup mieux que de réagir à tous les changements UserPreferenceCategory.General.

Avec tout cela dit, une implémentation simple serait la suivante:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        UserPreferenceChangedEventHandler UserPerferenceChanged = (s, e) =>
        { if (e.Category == UserPreferenceCategory.General || e.Category == UserPreferenceCategory.VisualStyle) BackColor = GetAccentColor(); };

        SystemEvents.UserPreferenceChanged += UserPerferenceChanged;
        Disposed += (object s, EventArgs e) => { SystemEvents.UserPreferenceChanged -= UserPerferenceChanged; };
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        BackColor = GetAccentColor();
    }

    static Windows.UI.ViewManagement.UISettings uiSettings = new Windows.UI.ViewManagement.UISettings();
    private static System.Drawing.Color GetAccentColor()
    {
        Windows.UI.Color c = uiSettings.GetColorValue(Windows.UI.ViewManagement.UIColorType.Accent);
        return Color.FromArgb(c.A, c.R, c.G, c.B);
    }
}


3 commentaires

Vous avez dit que WinForm est une vieille technologie, qu'est-ce que cela signifie? Je suis nouveau dans la programmation, je souhaite créer une application Windwos. Pouvez-vous me conseiller sur les nouvelles technologies pour créer une application Windows?


@MahmoodGaribov - J'aurais probablement dû l'appeler une technologie d'interface utilisateur mature qui englobe encore les API Win32 plus anciennes et qui reçoit peu de mises à jour. Il n'a commencé à bénéficier d'un support DPI élevé que depuis quelques années, et même cela est quelque peu limité. Cela dit, c'est toujours une plate-forme viable pour des projets simples qui ne nécessitent pas d'interfaces graphiques sophistiquées. Vous pouvez y ajouter des fonctionnalités, mais cela nécessite un codage personnalisé (c'est-à-dire ne vous attendez pas à ce qu'une fonctionnalité soit ajoutée simplement parce que vous le souhaitez). Les interfaces graphiques basées sur XAML (telles que WPF et UWP) sont censées être la voie à suivre recommandée pour les applications de bureau.


J'ai entendu les termes "WPF" et "UWP mais je ne savais pas ce que c'est. Merci pour vos conseils)).