53 votes

Vista/7 : Comment obtenir la couleur du verre ?

Comment utilisez-vous DwmGetColorizationColor ?

Le site documentation dit qu'il renvoie deux valeurs :

  • un système de 32 bits 0xAARRGGBB contenant la couleur utilisée pour la composition du verre
  • un paramètre booléen qui est vrai "si la couleur est un mélange opaque" ( quoi que cela signifie )

Voici une couleur que j'aime, un joli vert vomi : alt text

Vous pouvez remarquer que la couleur est verte, et la barre de titre translucide (sur un fond blanc) montre très clairement la couleur de la morve : enter image description here

J'essaie d'obtenir la couleur à partir de Windows :

DwmGetColorizationColor(dwCcolorization, bIsOpaqueBlend);

Et j'obtiens

dwColorization: 0x0D0A0F04
bIsOpaqueBlend: false

Selon la documentation, cette valeur a le format suivant AARRGGBB et ainsi de suite :

AA: 0x0D (13)
RR: 0x0A (10)
GG: 0x0F (15)
BB: 0x04 (4)

Cela signifie soi-disant que la couleur est (10, 15, 4), avec une opacité de ~5,1%.

Mais si vous regardez réellement cette valeur RVB, elle est loin du vert morveux que je souhaite. Voici

  • (10, 15, 4) avec une opacité nulle (la couleur originale), et
  • (10,15,4) avec une opacité de 5% sur un fond blanc/carreau :

alt text

Plutôt que d'être Lime vert, DwmGetColorizationColor renvoie une image presque entièrement transparente noir .

La question est donc la suivante : Comment obtenir la couleur du verre dans Windows Vista/7 ?

J'ai essayé d'utiliser DwmGetColorizationColor mais cela ne fonctionne pas très bien.


A personne ayant le même problème, mais avec une image plus brillante pour vous attirer les écureuils : alt text

Donc, ça se résume à . DwmGetColorizationColor est complètement inutilisable pour les applications qui tentent d'appliquer la couleur actuelle sur une surface opaque.


J'aime les captures d'écran de ce type bien mieux que le mien. En utilisant ses captures d'écran comme modèle, j'ai fait un peu plus d'étincelles :

alt text

alt text

alt text

alt text

alt text

alt text

Pour les deux dernières captures d'écran, la puce à mélange alpha est un véritable PNG partiellement transparent, qui se fond dans l'arrière-plan de votre navigateur. Cool ! (je suis un tel geek)

Edit 2 : J'ai dû les arranger en couleurs arc-en-ciel. (je suis un tel geek)

Edit 3 : Bien sûr, je dois maintenant ajouter le jaune.


Solutions de contournement non documentées/non supportées/fragiles

Il existe une exportation non documentée de DwmApi.dll au point d'entrée 137, que nous appellerons DwmGetColorizationParameters :

HRESULT GetColorizationParameters_Undocumented(out DWMCOLORIZATIONPARAMS params);

struct DWMCOLORIZATIONPARAMS
{
   public UInt32 ColorizationColor;
   public UInt32 ColorizationAfterglow;
   public UInt32 ColorizationColorBalance;
   public UInt32 ColorizationAfterglowBalance;
   public UInt32 ColorizationBlurBalance;
   public UInt32 ColorizationGlassReflectionIntensity;
   public UInt32 ColorizationOpaqueBlend;
}

Nous sommes intéressés par le premier paramètre : ColorizationColor .

Nous pouvons également lire la valeur à partir du registre :

HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM
    ColorizationColor: REG_DWORD = 0x6614A600

Donc vous choisissez votre poison pour créer des problèmes d'appcompat. Vous pouvez

Voir aussi


je voulais poser cette question depuis plus d'un an maintenant. j'ai toujours su qu'il était impossible d'y répondre, et que la seule façon d'attirer l'attention de quelqu'un est d'avoir des captures d'écran colorées ; les développeurs sont attirés par les choses brillantes. Mais d'un autre côté, cela signifie que j'ai dû mettre beaucoup de travail pour créer les appâts.

10voto

Rafael Rivera Points 384

Couleur de colorisation != la couleur de base choisie. C'est trompeur, je sais.

Mais je suis confus. L'image que vous avez empruntée provient de mon billet intitulé " Récupération de la couleur de base d'Aero Glass pour un rendu de surface opaque ". N'est-ce pas ce que vous voulez faire ? J'ai également indiqué dans le post l'emplacement du registre dans lequel sont stockées toutes les informations sur les couleurs (HKEY_CURRENT_USER \Software\Microsoft\Windows\DWM ) à des fins de recherche.

Édité le 8/26

DwmGetColorizationColor (dwmapi.dll) renvoie la "couleur de colorisation", qui est un mélange de diverses couleurs (y compris la couleur de base que vous avez sélectionnée) et de la logique du shader pour obtenir l'effet de verre global.

Toutes les informations sur les couleurs dont vous avez besoin ou que vous voulez se trouvent dans la clé de registre mentionnée ci-dessus. La couleur de base, les couleurs utilisées dans le mélange, et la couleur de colorisation résultante sont toutes là.

(La clé ci-dessus est présente sur Windows Vista et supérieur).

2voto

Patrick Dempsey Points 11

Je crois avoir résolu le problème de la couleur Aero. La couleur donnée par ColorizationColor est en fait AARRGGBB mais elle n'est pas du tout utilisée de la manière dont vous le pensez. Et afin de résoudre la couleur finale, vous devez également obtenir l'intensité de la couleur comme indiqué ici : http://www.codeproject.com/Articles/610909/Changing-Windows-Aero-Color

La première étape consiste à analyser AARRGGBB. Ensuite, prenez le RGB résultant et convertissez-le en HSV. La teinte pure plus la saturation à pleine luminosité est la couleur de base. Superposez maintenant la valeur sous forme d'échelle de gris à Alpha par-dessus la teinte et la saturation pures pour obtenir la couleur Aero. Superposez ensuite cette couleur à la couleur de l'image : rgb(235, 235, 235) à Intensité pour obtenir le résultat final de la couleur aéro composite.

Enfin, j'ai également fourni un exemple de la façon d'extraire une couleur de barre d'outils utilisable qui correspond à la couleur du cadre Aero, mais qui fonctionnera toujours avec du texte noir et d'autres fonctions Aero de base. Pour ce faire, il suffit de limiter l'intensité à 35 %.

Voici le calcul :

  function dwmToRgb() { 
    // Input Values
    var colorizationColor = "a84f1b1b"; // dwmcolor.clrColor = ColorizationColor
    var colorizationColorBalance = 60; // dwmcolor.nIntensity = ColorizationColorBalance 
    var F = 235; // Frame base grayscale color when Transparency is disabled

    // Parse the input values    
    var A = Math.round(parseInt(colorizationColor.substr(0,2),16)/2.55)/100;
    var R1 = parseInt(colorizationColor.substr(2,2), 16);
    var G1 = parseInt(colorizationColor.substr(4,2), 16);
    var B1 = parseInt(colorizationColor.substr(6,2), 16);
    var I = colorizationColorBalance/100;

    // Solve for HSV Value and pure Hue+Sat
    var V = Math.max(R1, G1, B1);
    var R2 = R1*255/V;
    var G2 = G1*255/V;
    var B2 = B1*255/V;

    // Aero Frame Pure Hue: Overlay Value @ Alpha over pure Hue+Sat
    var R3 = Math.round(V+(R2-V)-((R2-V)*A));
    var G3 = Math.round(V+(G2-V)-((G2-V)*A));
    var B3 = Math.round(V+(B2-V)-((B2-V)*A)); 
    var hexRGB3 = "#" + ((1 << 24) + (R3 << 16) + (G3 << 8) + B3).toString(16).slice(1);

    // Aero Frame Composite Color: Overlay RGB3 @ Intensity over Frame base color        
    var R4 = Math.round(R3+(F-R3)-((F-R3)*I));
    var G4 = Math.round(G3+(F-G3)-((F-G3)*I));
    var B4 = Math.round(B3+(F-B3)-((F-B3)*I));   
    var hexRGB4 = "#" + ((1 << 24) + (R4 << 16) + (G4 << 8) + B4).toString(16).slice(1);

    // Aero Toolbar Color: Overlay RGB3 @ max 35% Intensity over Frame base color   
    if (I > 0.35) { I5 = 0.35;} else { I5 = I;}
    var R5 = Math.round(R3+(F-R3)-((F-R3)*I5));
    var G5 = Math.round(G3+(F-G3)-((F-G3)*I5));
    var B5 = Math.round(B3+(F-B3)-((F-B3)*I5));   
    var hexRGB5 = "#" + ((1 << 24) + (R5 << 16) + (G5 << 8) + B5).toString(16).slice(1);

1voto

Mchl Points 32343

Comment trouvez-vous l'A0F040 ?


OP Edit : Voici à quoi ressemble 0xA0F040 pour moi :

alt text

0voto

Lazlo Points 1944

Avez-vous essayé DwmGetColorizationParameters, et mélanger/travailler à partir de cela ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X