Как вы используете DwmGetColorizationColor
?
документация говорит, что он возвращает два значения:
- 32-бит
0xAARRGGBB
, содержащий цвет, используемый для композиции стекла - логический параметр, который является истинным "если цвет является непрозрачной смесью" (что бы это ни значило)
Вот цвет, который мне нравится, красивый зеленый блеск:
Вы можете заметить, что цвет зеленый, а полупрозрачная строка заголовка (на белом фоне) очень четко показывает цвет сота:
Я пытаюсь получить цвет из 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% на фоне белой/шахматной доски:
Вместо Lime
зеленого цвета DwmGetColorizationColor
возвращает почти полностью прозрачный черный.
Итак, вопрос: Как получить цвет стекла в Windows Vista/7?
Я попытался использовать DwmGetColorizationColor
, но это не работает очень хорошо.
A человек с той же проблемой, но более красивое блестящее изображение, чтобы привлечь вас белки:
Итак, это сводится к - DwmGetColorizationColor полностью неприменимо для приложений, пытающихся применить текущий цвет на непрозрачная поверхность.
Для последних двух скриншотов альфа-смешанный чип - это истинный частично прозрачный 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 (который bad, bad, bad, и может уйти в любое время)
- используйте недокументированный раздел реестра (который также bad, и может уйти в любое время)
См. также
- Есть ли список допустимых комбинаций параметров для API-интерфейсов GetThemeColor/Visual Styles
- Как Windows меняет цвет Aero Glass?
- DWM - Цветная обработка цветов с использованием DWMGetColorizationColor
- Извлечение базового цвета Aero Glass для непрозрачной визуализации поверхности
Я хотел задать этот вопрос уже более года. я всегда знал, что ответить невозможно, и что единственный способ заставить кого-нибудь фактически обратить внимание - это иметь красочные скриншоты; разработчиков привлекают блестящие вещи. Но с другой стороны это означает, что мне пришлось приложить всевозможные усилия для создания приманок.