Vista / 7: Как получить цвет стекла? - PullRequest
53 голосов
/ 25 августа 2010

Как вы используете DwmGetColorizationColor?

Документация говорит, что возвращает два значения:

  • 32-бит0xAARRGGBB содержит цвет, используемый для композиции стекла
  • логический параметр, который имеет значение true, "если цвет представляет собой непрозрачную смесь" ( независимо от того, что означает )

Вот цвет, который мне нравится, приятный зеленый оттенок: alt text

Вы можете заметить, что цвет зеленый, и полупрозрачная строка заголовка (на белом фоне) очень четко показывает цвет сопли: enter image description here

Я пытаюсь получить цвет из Windows:

DwmGetColorizationColor(dwCcolorization, bIsOpaqueBlend);

И я получаю

dwColorization: 0x0D0A0F04
bIsOpaqueBlend: false

Согласно документации это значение имеет формат AARRGGBB, и поэтому содержит:

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

Это предположительно означает, что цвет (10, 15, 4), с непрозрачностью ~ 5,1%.

Но если вы действительно посмотрите на этоЗначение RGB, оно не близко к желаемым зеленым соплям.Вот

  • (10, 15, 4) с нулевой непрозрачностью (исходный цвет) и
  • (10,15,4) с 5% непрозрачностью для белого / шахматной доскифон:

alt text

Вместо того, чтобы быть Lime зеленым, DwmGetColorizationColor возвращает почти полностью прозрачный черный .

Итак, вопрос: Как получить цвет стекла в Windows Vista / 7?

Я пытался использовать DwmGetColorizationColor, но это не очень хорошо работает.


A человек с такой же проблемой, но с более блестящей блестящей картинкой , чтобы привлечь вас, белок: alt text

Итак, он сводится к - DwmGetColorizationColor совершенно непригоден для приложенийпытаясь применить текущий цвет на непрозрачной поверхности.


я люблю скриншоты этого парня намного лучше, чем у меня.Используя его скриншоты в качестве шаблона, я сделал еще несколько блесток:

alt text

alt text

alt text

alt text

alt text

alt text

Для двух последних снимков экрана альфа-микросхема представляет собой настоящий частично прозрачный PNG, который сливается с фоном вашего браузера.,Здорово!(Я такой придурок)

Редактировать 2: Пришлось расположить их в цвете радуги.(Я такой фанат)

Редактировать 3: Ну, теперь я, конечно, должен добавить желтый.


Недокументированный / Неподдерживаемый / ХрупкийОбходные пути

Существует недокументированный экспорт из DwmApi.dll в точке входа 137, который мы назовем 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;
}

Нас интересует первый параметр: ColorizationColor.

Мы также можем прочитать значение из реестра:

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

Таким образом, вы выбираете яд для создания проблем с appcompat.Вы можете

См. Также


Я хотел задать этот вопрос уже больше года.я всегда знал, что на это невозможно ответить, и что единственный способ заставить кого-то обратить внимание - это сделать красочные скриншоты;разработчиков привлекают блестящие вещи.Но с другой стороны это означает, что мне пришлось приложить все усилия для изготовления приманок.

Ответы [ 3 ]

10 голосов
/ 25 августа 2010

Цвет окраски! = Выбран базовый цвет.Это вводит в заблуждение, я знаю.

Но я в замешательстве.Изображение, которое вы позаимствовали, было из моего поста, озаглавленного " Получение базового цвета Aero Glass для рендеринга непрозрачной поверхности ".Разве это не то, что вы хотите сделать?Я также указал в сообщении местоположение реестра, в котором хранится вся информация о цвете (HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ DWM) для поисковых целей.

Отредактировано 8/26

DwmGetColorizationColor (dwmapi.dll) возвращает «цвет окраски», представляющий собой смесь различных цветов (включая выбранный вами базовый цвет) и шейдерной логики для достижения общего эффекта стекла.

ВсеИнформация о цвете, которая вам нужна / нужна, находится в разделе реестра, указанном выше.Базовый цвет, цвета, используемые при смешивании, и результирующий цвет окраски - все это есть.

(ключ выше присутствует в Windows Vista и выше.)

2 голосов
/ 09 апреля 2014

Мне кажется, я решил Aero Color. Цвет, заданный ColorizationColor, на самом деле AARRGGBB, но он не используется так, как вы думаете. И чтобы решить окончательный цвет, вам также нужно получить интенсивность цвета, как показано здесь: http://www.codeproject.com/Articles/610909/Changing-Windows-Aero-Color

Первым шагом является анализ AARRGGBB. Затем возьмите полученный RGB и конвертируйте в HSV. Чистый оттенок плюс насыщенность при полной яркости - это основной цвет. Теперь наложите Value в оттенках серого на Alpha поверх чистого Hue и Saturation, чтобы получить цвет Aero. Затем наложите этот цвет поверх цвета рамки: rgb (235, 235, 235) на Intensity, чтобы получить окончательный результат цвета Composite Aero.

Наконец, я также привел пример того, как извлечь полезный цвет панели инструментов, который соответствует цвету рамки Aero, но всегда будет работать с черным текстом и другими основными функциями Aero. Это достигается путем ограничения интенсивности до 35%.

Вот математика:

  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);
1 голос
/ 25 августа 2010

Как вам A0F040 выглядит?


OP Edit: Вот как мне выглядит 0xA0F040:

alt text

...