DWM, он же Desktop Window Manager - современная графическая подсистема, появившаяся ещё в ранних альфа-сборках Windows Vista под именем DCE (Desktop Compositing Engine). При помощи неё реализован новомодный графический интерфейс Aero в Windows Vista и Windows 7. Хотите узнать подробней, как работает DWM? Вам интересно, какие параметры реестра влияют его работу? Хотите узнать, как работать с ним программно? Тогда вперед, под кат. Если вам станет скучно - в конце статьи покажу котика.
В операционной системе Windows 7 движок Desktop Windows Manager инициализируется запуском одноименной службы. Грубо говоря, эту служба и есть движок. При запуске она читает ветку реестра
[code]HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM[/code]
Ищет и использует она там следующие параметры (все типа DWORD):
Composition
Управляет композицией окон. Фактически, включает или отключает работу движка.
1 - включено, 0 - выключено.
CompositionPolicy - в бета-версия Windows Vista ключ позволял принудительно включать Aero на неподдерживаемом оборудовании при значении 2. Есть подозрение, что сейчас значение ключа не обрабатывается.
ColorizationOpaqueBlend
Управляет прозрачностью окон. Позволяет отключать прозрачность без отключения композции.
0 - использовать прозрачность окон, 1 - сплошная заливка окон со страйпами (линии, идущие через окно).
ColorizationGlassReflectionIntensity - количество линий на окнах. Значение лежит в интервале [0..100], по умолчанию 50.
ColorizationColor - основной цвет активного окна. Представляет собой ARGB значение цвета:
Alpha [0..255], Красный [0..255], Зеленый [0..255], Синий [0..255].
ColorizationColorBalance - управляет насыщенностью цвета ColorizationColor. Значение лежит в интервале [0..100].
ColorizationAfterglow - основной цвет для неактивных окон. Если вы поместите заголовок окна над другим заголовком, в месте наложения этот цвет проявится особенно отчетливо. Операционные системы Windows 7/Vista не позволяют оперировать этой настройкой через интерфейс пользователя. Представляет собой ARGB значение цвета:
Alpha [0..255], Красный [0..255], Зеленый [0..255], Синий [0..255].
Отмечу, что и активные, и неактивные окна окрашиваются в смешанный ColorizationColor+ColorizationAfterglow цвет. Вес каждого цвета определяют ColorizationColorBalance для активного, и ColorizationAfterglowBalance для неактивного окна. При равном весе и разных цветах активное и неактивное окна разительно отличаются цветами. При ColorizationAfterglowBalance>ColorizationColorBalance в цвете активных окон начинает преобладать основной цвет неактивного окна и наоборот.
ColorizationAfterglowBalance - управляет насыщенностью цвета ColorizationAfterglow. Значение лежит в интервале [0..100].
ColorizationBlurBalance - управляет эффектом размытия цвета ColorizationColor+ColorizationAfterglow. Значение лежит в интервале [0..100]. Минимальные значения делают текущее активное окно менее прозрачным, максимальное - делает активное и неактивное окна прозрачными и цветом, одинаковым у обоих, смесью ColorizationColor+ColorizationAfterglow. При ColorizationColorBalance и ColorizationAfterglowBalance, равных нулю одновременно, а ColorizationBlurBalance равным 100, окна становятся "стеклянными", т.е. обесцвечиваются.
EnableAeroPeek - отключает пункт контекстного меню "Показывать рабочий стол при наведении" кнопки "Свернуть все окна" в панели задач справа, равно как отключает саму функцию. 1 - предпросмотр включен, 0 - выключен.
HideBlur - в отладочных версиях Windows 7 отключал эффект размытия цветов. Сейчас не используется.
После внесения изменения в эти параметры вручную через редактор реестра, дабы применить их, следует перезапустить службу Desktop Window Manager. Наблюдательный читатель знает, что Windows 7 применяет эти параметры без перезапуска службы. Как она это делает, мы сейчас узнает.
Программное управление DWM: меняем параметры прозрачности окон и их цвет на примере C#.
Для программного управления параметрами DWM/Aero можно воспользоваться двумя функциями из библиотеки dwmapi.dll. Они недокументированы, однако давно "раскопаны" народными умельцами утилитами вроде IDA.
1. DwmpGetColorizationParameters
Функция получает текущие параметры DWM. Применительно к C#, её объявление должно быть таким:
[code][DllImport("dwmapi.dll", EntryPoint = "#131")]
public static extern int DwmpGetColorizationParameters(out DwmColorParams dcpParams);[/code]
Её параметр - ссылка на структуру, в которой представлены параметры реестра. Вот так, например:
[code]public struct DwmColorParams
{
public UInt32 ColorizationColor;
public UInt32 ColorizationAfterglow;
public UInt32 ColorizationColorBalance;
public UInt32 ColorizationAfterglowBalance;
public UInt32 ColorizationBlurBalance;
public UInt32 ColorizationGlassReflectionIntensity;
public UInt32 ColorizationOpaqueBlend;
};[/code]
Пример вызова:
[code]DwmColorParams Colors = new DwmColorParams();
DwmpGetColorizationParameters(out Colors);[/code]
Colors.ColorizationColor будет содержать текущий цвет окрашивания активных окон.
Перевести его к структуре Color можно таким образом:
[code]Color BackColor =Color.FromArgb((int)Colors.ColorizationColor);[/code]
Аналогично для других параметров.
2. DwmpSetColorizationParameters
Функция устанавливает параметры DWM "вживую", без перезапуска DWM.
[code][DllImport("dwmapi.dll", EntryPoint = "#127")]
public static extern int DwmpSetColorizationParameters(ref DwmColorParams dcpParams, bool someBool);[/code]
Первый параметр - ссылка на ту же самую структуру. Назначение второго параметра неизвестно, во всяком случае, мне. Подозреваю, он зарезервирован для внутренних целей или будущих разработок. Общепринято его задавать равным true.
Пример использования:
[code]DwmColorParams Colors = new DwmColorParams();
Colors.ColorizationAfterglowBalance = 20;
Colors.ColorizationColorBalance =50;
Colors.ColorizationBlurBalance = 30;
Colors.ColorizationGlassReflectionIntensity =50;
Colors.ColorizationOpaqueBlend = 0;
DwmpSetColorizationParameters(ref Colors,true);[/code]
Как несложно догадаться, чтобы при следующем запуске установленные параметры сохранились, их необходимо записать в реестр.
[code]RegistryKey RegKey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\DWM\\", true);
if (RegKey == null)
{ return; }
RegKey.SetValue("ColorizationColor", (int)Colors.ColorizationColor, RegistryValueKind.DWord);
RegKey.SetValue("ColorizationAfterglow", (int)Colors.ColorizationAfterglow, RegistryValueKind.DWord);
RegKey.SetValue("ColorizationColorBalance", (int)Colors.ColorizationColorBalance, RegistryValueKind.DWord);
RegKey.SetValue("ColorizationAfterglowBalance", (int)Colors.ColorizationAfterglowBalance, RegistryValueKind.DWord);
RegKey.SetValue("ColorizationBlurBalance", (int)Colors.ColorizationBlurBalance, RegistryValueKind.DWord);
RegKey.SetValue("ColorizationOpaqueBlend", (int)Colors.ColorizationOpaqueBlend, RegistryValueKind.DWord);
RegKey.SetValue("ColorizationGlassReflectionIntensity", (int)Colors.ColorizationGlassReflectionIntensity, RegistryValueKind.DWord);
RegKey.Close();[/code]
Персонализация Windows 7 меняет значения комплексно, например, ColorizationColorBalance+ColorizationBlurBalance+ColorizationAfterglowBalance всегда у неё дают в сумме 100, а ColorizationAfterglow и ColorizationGlassReflectionIntensity она вообще задавать не дает, что вобщем-то, не наглядно.
В качестве более наглядного примера я набросал простенькое приложение AeroTuner, которое позволяет поиграть с вышеуказанными параметрами. Выставьте значенния на как на рисунке и подвигайте ползунки:
Котик:
💡Узнавайте о новых статьях быстрее. Подпишитесь на наши каналы в Telegram и Twitter.
вопрос не по теме немного. при написании программы, ты пользовался готовой библиотекой для создания AeroGlass или сам писал? почему спрашиваю: если сам, не мог бы сорцами поделиться? просто библиотеки в сети которые лежат, под .Net 4 не хотят работать.
а за статью спасибо большое, познавательно. беру на заметку.
@INFINUM
да там даже не библиотека, а просто вывоз функций, как в статье.
Выглядит он вот так:
[code]public partial class Form1 : Form
{
[StructLayout(LayoutKind.Sequential)]
public struct DwmColorParams
{
public UInt32 ColorizationColor;
public UInt32 ColorizationAfterglow;
public UInt32 ColorizationColorBalance;
public UInt32 ColorizationAfterglowBalance;
public UInt32 ColorizationBlurBalance;
public UInt32 ColorizationGlassReflectionIntensity;
public UInt32 ColorizationOpaqueBlend;
};
[DllImport(«dwmapi.dll», EntryPoint = «#127»)]
public static extern int DwmpGetColorizationParameters(out DwmColorParams dcpParams);
[DllImport(«dwmapi.dll», EntryPoint = «#131»)]
public static extern int DwmpSetColorizationParameters(ref DwmColorParams dcpParams, bool alwaysTrue);[/code]
Пример вызова:
[code]private void button1_Click(object sender, EventArgs e)
{
DwmColorParams sDwmColorParams = new DwmColorParams();
DwmpGetColorizationParameters(out sDwmColorParams);
sDwmColorParams.ColorizationColor = (uint)pbColor.BackColor.ToArgb();
sDwmColorParams.ColorizationAfterglow=(uint)pbGlow.BackColor.ToArgb();
sDwmColorParams.ColorizationBlurBalance=(uint)trColorization.Value;
sDwmColorParams.ColorizationAfterglowBalance = (uint)trGlow.Value;
sDwmColorParams.ColorizationBlurBalance = (uint)trBlur.Value;
sDwmColorParams.ColorizationGlassReflectionIntensity = (uint)trRefl.Value;
DwmpSetColorizationParameters(ref sDwmColorParams, true);
}[/code]