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

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

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

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

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

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

я пытаюсь получить цвет из 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 green, DwmGetColorizationColor возвращает почти полностью прозрачный черный цвет .

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

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


Человек с той же проблемой, но более яркая блестящая картина, чтобы привлечь вас белки: 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 

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

  • полагаться на недокументированный API (который является плохим , плохим , плохим и может уйти в любое время )
  • используйте недокументированный ключ реестра (что также плохо , и может уйти в любое время )

Смотрите также

  • Есть ли список допустимых комбинаций параметров для API GetThemeColor / Visual Styles
  • Как Windows меняет цвет Aero Glass?
  • DWM – Цветная обработка цветов с использованием DWMGetColorizationColor
  • Получение базового цвета Aero Glass для непрозрачной визуализации поверхности

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

3 Solutions collect form web for “Vista / 7: Как получить цвет стекла?”

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

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

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

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

Вся необходимая информация о цвете вы можете найти в разделе реестра, отмеченном выше. Основной цвет, цвета, используемые при смешивании, и получившийся цвет окраски – все это.

(Ключ, указанный выше, присутствует в Windows Vista и выше).

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

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

Наконец, я также представил пример того, как извлечь полезный цвет панели инструментов, соответствующий цвету frameworks 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); 

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


OP Edit: так выглядит 0xA0F040:

alt text

  • Добавление внешней библиотеки в проект Qt Creator
  • Использование глобальной клавиатуры (WH_KEYBOARD_LL) в WPF / C #
  • В чем отличия между VirtualAlloc и HeapAlloc?
  • Win32Exception Недостаточно памяти для обработки этой команды
  • Запуск процесса мониторинга в системе
  • Перенаправление cout на консоль в windows
  • Как загрузить PNG-образ с помощью Win32 / GDI (если нет GDI +)?
  • Как запустить Windows, скомпилированную для PowerPC на современных компьютерах PowerPC без набора инструкций,?
  • Как приложение Metro в Windows 8 взаимодействует с настольным настольным окном на одном компьютере?
  • Как определить текущее разрешение экрана?
  • Как хранить и извлекать учетные данные из диспетчера учетных данных Windows Vault?
  • Давайте будем гением компьютера.