Как установить цвет смешивания стекла в Windows 10?

С использованиемнезадокументированныйSetWindowCompositionAttribute API в Windows 10 можно включить стекло для окна. Стекло белое или прозрачное, как видно на этом скриншоте:

Тем не менее, меню «Пуск» Windows 10 и центр уведомлений, в котором также используется стекло, смешиваются с акцентным цветом следующим образом:

Как это сделать?

исследования

Цвет акцента в следующих примерах светло-фиолетовый - вот скриншот из приложения «Настройки»:

Структура AccentPolicy, определенная в этом примере кода имеет состояние акцента, флаги и градиентные цветовые поля:

  AccentPolicy = packed record
    AccentState: Integer;
    AccentFlags: Integer;
    GradientColor: Integer;
    AnimationId: Integer;
  end;

и состояние может иметь любое из следующих значений:

  ACCENT_ENABLE_GRADIENT = 1;
  ACCENT_ENABLE_TRANSPARENTGRADIENT = 2;
  ACCENT_ENABLE_BLURBEHIND = 3;

Обратите внимание, что первые два из них были найдены наэтот GitHub Гист.

Третий работает отлично - это позволяет стекло. Из двух других

В результате ACCENT_ENABLE_GRADIENT окно становится полностью серым, независимо от того, что находится за ним. Нет прозрачности или эффекта стекла, но нарисованный цвет окна рисуется DWM, а не приложением.

ACCENT_ENABLE_TRANSPARENTGRADIENT приводит к окну, которое полностью окрашено цветом акцента, независимо от того, что стоит за ним. Нет прозрачности или эффекта стекла, но нарисованный цвет окна рисуется DWM, а не приложением.

Так что это близко, и похоже, что некоторые из всплывающих окон, такие как апплет управления громкостью, используют.

Значения нельзя объединять или редактировать вместе, и значение поля GradientColor не имеет никакого эффекта, за исключением того, что оно должно быть ненулевым.

Рисование непосредственно на стекле с включенным окном приводит к очень странному смешиванию. Здесь он заполняет клиентскую область красным (0x000000FF в формате ABGR):

и любая ненулевая альфа, например, 0xAA0000FF, приводит к отсутствию цвета вообще:

Не соответствует внешний вид меню «Пуск» или области уведомлений.

Как эти окна делают это?

Ответы на вопрос(3)

Ваш ответ на вопрос