Como você define a cor da mistura de vidro no Windows 10?

Usando oindocumentadoSetWindowCompositionAttribute API no Windows 10, é possível ativar o vidro para uma janela. O vidro é branco ou transparente, como pode ser visto nesta captura de tela:

No entanto, o menu Iniciar do Windows 10 e o centro de notificações, que também usam vidro, combinam com a cor de destaque, da seguinte forma:

Como isso acontece?

Investigações

A cor de destaque nos exemplos a seguir é roxa clara - aqui está uma captura de tela do aplicativo Configurações:

oEstrutura AccentPolicy definida neste código de exemplo possui estado de destaque, sinalizadores e campos de cores degradê:

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

e o estado pode ter qualquer um destes valores:

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

Observe que os dois primeiros foram encontrados emessa essência do github.

O terceiro funciona bem - isso permite o vidro. Dos outros dois,

ACCENT_ENABLE_GRADIENT resulta em uma janela totalmente cinza, independentemente do que está por trás dela. Não há transparência ou efeito de vidro, mas a cor da janela que está sendo desenhada está sendo desenhada pelo DWM, não pelo aplicativo.

ACCENT_ENABLE_TRANSPARENTGRADIENT resulta em uma janela pintada completamente com a cor de destaque, independentemente do que está por trás dela. Não há transparência ou efeito de vidro, mas a cor da janela que está sendo desenhada está sendo desenhada pelo DWM, não pelo aplicativo.

Portanto, isso está chegando perto e parece ser o que algumas das janelas pop-up, como o applet de controle de volume, usam.

Os valores não podem ser agrupados e o valor do campo GradientColor não tem efeito, exceto que deve ser diferente de zero.

Desenhar diretamente em uma janela com vidro resulta em uma mistura muito estranha. Aqui está preenchendo a área do cliente com vermelho (0x000000FF no formato ABGR):

e qualquer alfa diferente de zero, por exemplo, 0xAA0000FF, resulta em nenhuma cor:

Não corresponda à aparência do menu Iniciar ou da área de notificação.

Como essas janelas fazem isso?

questionAnswers(3)

yourAnswerToTheQuestion