Параметры диспетчера окон Windows 8, или DWM под микросопом-2

Вместо вступления

Всё, что будет описано в этой статье, в полной мере относится только к RTM релизу Windows 8, где диспетчер окон Windows изменился крайне радикально. Если используете Windows 8 RP/CP/DP, или Windows 7, обратите внимание на первую часть этой публикации: DWM под микросопом

DWM (Desktop Window Manager) – неотъемлемая часть графического интерфейса линейки Windows NT 6.x, в которую входят Vista, Windows 7 и Windows 8. Смена цветов окон «на лету», прозрачные темы Aero Glass, умопомрачительные Win+Tab, превьюшки окон и эффекты анимации – это как раз его заслуга. В этой статье я бы хотел рассказать вам, как изменился DWM в финальном релизе Windows 8, какие из его параметров вы можете контролировать и на что они влияют, и как это можно делать через API на примере языка программирования C#.

 Изменения в DWM в финальном релизе Windows 8

Уволен со службы

В Windows 7 DWM, представленный процессом dwm.exe и набором системных библиотек, был службой, которой пользователь мог управлять посредством оснастки администрирования «Службы» services.msc:

Запуск процесса DWM/dwm.exe лежал на плечах системного контроллера служб и процесса svсhost.exe. В Windows 8 DWM лишился службы, и инициализируется процессом winlogon.exe:

Работает без выходных и отпуска

Winlogon.exe тщательно "следит" за своим потомком, и если пользователь Windows, какой-то вирус или непредвиденный сбой в самом процессе dwm.exe вдруг приведет к его завершению - он тут же будет перезапущен, а сам диспетчер окон отключить более нельзя. Что это значит? А вот что.

Как вы знаете, со времен Vista в распоряжении пользователя были два варианта оформления, точнее, два вида тем оформления: классический движок "базовых" тем, появившийся ещё во времена Windows XP:

Базовая тема по умолчанию в Windows 7

А также новый вид Aero-тем, как раз знаменитый всеми свистелками и перделками, которые я упомянул в начале статьи:

Новые темы Aero (стандартная тема)

Сделав DWM постоянно включенным и не отключаемым, Майкрософт исключила возможность использования базовых тем. Пользователь Windows 8 всегда будет использовать современные Aero-темы оформления, хочет он этого или нет. Сделано всё это для экономии системных ресурсов и продления времени жизни компьютера от батареи (это актуально в свете грядущего изобилия планшетов на Windows 8). Сделано, кстати, довольно кустарно: тема оформления Windows 8 всё ещё включает в себя прозрачные ресурсы, это полноценная Aero Glass тема. Однако, DWM заливает рамку окна сплошным цветом и в нем отключено размытие границ окон (Blur). И вот что примечательно - также на месте и все ресурсы оформления "базовой" темы. Я испортил системные файлы так, чтобы композиция окон не смогла примениться, и Windows 8 переключилась назад в базовый стиль:

Базовая тема Windows 8 RTM

Параметры DWM в реестре

Как вы успели понять, DWM  в Windows 8 "похудел" функционально, и это напрямую сказалось на количестве параметров, которые влияют на его работу. Часть из них пропала совсем, часть не имеет никакого эффекта, и появилась пара новых.

При запуске процесса dwm.exe происходит чтение ветки реестра

[code]HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM[/code]

Все параметры, которые здесь находятся, имеют тип DWORD.

Они также могут переопределяться групповой политикой, но это неважно в контексте этой статьи.

Параметры DWM, непосредственно влияющие на его работу

 

ColorizationColor - цвет окон и панели задач. Представляет собой ARGB значение цвета:
Alpha [0..255], Красный [0..255], Зеленый [0..255], Синий [0..255].

ColorizationColorBalance - управляет насыщенностью цвета ColorizationColor. Значение лежит в интервале [0..100].

EnableWindowColorization - новыйнедокументированный параметр, который позволяет отключить окраску границ окон. Имеет значение 1 или 0. Если задан нулю, то окна в Windows 8 становятся белыми, настройка "Цвет окна" будет влиять только на цвет панели задач. Вот так это выглядит на практике:

При EnabledWindowColor=0 в выбранный цвет окрашена только панель задач
При EnabledWindowColor=0 в выбранный цвет окрашена только панель задач

Зачем это, спросите вы. Я не знаю. Эта странная функция возникла где-то на этапе между Release Preview и RTM, и даже управлялась через пользовательский интерфейс.

Был такой флажок в персонализации (в сборке 8431, кажется)

Флажок исключили из финальной версии Windows 8, но функция сохранила свою работоспособность и даже управляется через API.

ColorizationGlassAttribute - тоже новый параметр. Может принимать значения 0, 1 или 2. Параметр 2 служит для активации высококонтрастных тем для людей со ограниченными возможностями. Используется в сочетании со специальной метрикой окон, без которой работает некорректно.

При смене цвета при помощи выбора новой темы принимает значение 1.

Если же цвет был установлен вручную через апплет, подобный тому, что на рисунке выше, ColorizationGlassAttribute  будет равным нулю. При этом, разницы в поведении DWM я не обнаружил, будь параметр равен нулю или единице. Скорее всего, эта два значения это какой-то рудимент от исключенной из Windows 8 RTM функции.

Примечательно, что если выставить ColorizationGlassAttribute  равным 2 принудительно, при использовании обычной темы оформления, границы окон становятся прозрачными, как слеза:

windows 8 transparency
Выглядит довольно гадко

EnableAeroPeek - задействует пункт контекстного меню "Показывать рабочий стол при наведении" кнопки "Свернуть все окна" в панели задач справа:. 1 - предпросмотр включен, 0 - выключен. Хотя эта возможность реализуется непосредственно средствами DWM, относится она к Проводнику, и параметр также читается Проводником, а не диспетчером окон.

На этом полезные параметры DWM в Windows 8 заканчиваются. В реестре присутствует ещё ряд параметров, которые не имеют никакого эффекта.

 

Параметры DWM, которые существуют, но не оказывают влияния на его работу

 

ColorizationAfterglow - раньше задавал основной цвет для неактивных окон. Если вы поместите заголовок окна над другим заголовком, в месте наложения этот цвет проявится особенно отчетливо.

ColorizationAfterglowBalance - раньше управлял насыщенностью цвета ColorizationAfterglow.

ColorizationBlurBalance - управлял эффектом размытия цвета ColorizationColor+ColorizationAfterglow.

Эти параметры по-прежнему задаются при смене цвета окон, но действия не имеют. Их значения меняются только потому, что они пересчитываются старыми функциями из dwmapi.dll, логика которых не была изменена со времен Windows 7. Давайте посмотрим на них поближе.

Работа с Windows 8 DWM через API на примере C#. Программная смена цвета Aero в Windows 8

Как я уже писал выше, для работы с DWM на программном уровне можно воспользоваться старыми функциями. Это DwmpGetColorizationParameters и DwmpSetColorizationParameters. Обе функции вызываются принимают в качестве входного параметра структуру, соответствующую набору параметров в реестре. Она должна быть описана так:

[code]        [StructLayout(LayoutKind.Sequential)]
public struct DwmColorParams
{
public UInt32 ColorizationColor;
public UInt32 ColorizationAfterglow;
public UInt32 ColorizationColorBalance;
public UInt32 ColorizationAfterglowBalance;
public UInt32 ColorizationBlurBalance;
public UInt32 EnableWindowColorization;
public UInt32 ColorizationGlassAttribute;
};
[/code]

"Старые" не работающие параметры всё ещё необходимы для успешной работы с API.

Объявление самих функций ничем не отличается от Windows 7:

[code][DllImport("dwmapi.dll", EntryPoint = "#131")]
public static extern int DwmpSetColorizationParameters(ref DwmColorParams dcpParams, bool someBool);

[DllImport("dwmapi.dll", EntryPoint = "#127")]
public static extern int DwmpGetColorizationParameters(out DwmColorParams dcpParams);[/code]

Пример простого консольного приложения, при запуске которого цвет окон становится красным с максимальной насыщенностью:

[code]using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
namespace sampleapp
{
class Program
{
static void Main(string[] args)
{
DWM.DwmColorParams dcpParams = new DWM.DwmColorParams();
DWM.DwmpGetColorizationParameters(out dcpParams);
dcpParams.ColorizationColor = (uint)Color.Red.ToArgb();
dcpParams.ColorizationColorBalance = 100;
DWM.DwmpSetColorizationParameters(ref dcpParams, true);
}
}

public static class DWM
{
[StructLayout(LayoutKind.Sequential)]
public struct DwmColorParams
{
public UInt32 ColorizationColor;
public UInt32 ColorizationAfterglow;
public UInt32 ColorizationColorBalance;
public UInt32 ColorizationAfterglowBalance;
public UInt32 ColorizationBlurBalance;
public UInt32 EnableWindowColorization;
public UInt32 ColorizationGlassAttribute;
};

[DllImport("dwmapi.dll", EntryPoint = "#131")]
public static extern int DwmpSetColorizationParameters(ref DwmColorParams dcpParams, bool someBool);

[DllImport("dwmapi.dll", EntryPoint = "#127")]
public static extern int DwmpGetColorizationParameters(out DwmColorParams dcpParams);

}

}
[/code]

Скачать проект для Visual Studio 2012

Демо - приложение Aero8Tuner

Как и в прошлый раз, я написал простое приложение, которое вам позволит менять все параметры Aero/DWM в Windows 8 на лету.

Если вы уже установили Windows 8 RTM, попробуйте установить флажки.

Скачать Aero8Tuner


Что ж, теперь вы готовы к встрече с DWM в Windows 8 во всеоружии. Надеюсь, вам было интересно.

💡Узнавайте о новых статьях быстрее. Подпишитесь на наши каналы в Telegram и Twitter.

Судя по тому, что вы читаете этот текст, вы дочитали эту статью до конца. Если она вам понравилась, поделитесь, пожалуйста, с помощью кнопок ниже. Спасибо за вашу поддержку!

Автор: Сергей Ткаченко

Сергей Ткаченко создал этот сайт в далёком 2009 году, и с тех пор продолжает над ним работать, публикуя новые материалы о Windows и её приложениях практически каждый день.

Параметры диспетчера окон Windows 8, или DWM под микросопом-2: 29 комментариев

  1. аеротюнером можно также менять цвет окон в server 2012 где это отключено и какой то идиот сделал окна по умолчанию голубенькими , так что many thanks

  2. а еще надеялись, что окошкам «восьмерки» можно вернуть полупрозрачность аэро глас

  3. Где найти ответ на вопрос — Будет ли на Вин8 полноценное аэро как на вин7 так как без нормальной прозрачности жить невозмонжо Прозрачные как слеза заголовки не в счет это ничего не решает

    1. Ответ — не будет. Достаточно прочитать статью не только в месте про «прозрачные заголовки». Сам движок отрисовки изменен, и окна всегда закрашиваются в выбранный цвет (ну или в белый).
      Прозрачность сделать нельзя.

  4. Может рукастые люди смогут из релиз превью вытянуть нужные файлики заменив их в РТМ версии? Технически это возможно? Если нет то остается надежда на какой нить stardock,что они навояют прогу и темы под нее с вин 7 интервейсом

  5. Сергей Ткаченко :
    Не совсем понял вопрос. О чем идет речь?

    цвет шрифта в заголовке окна не меняется. На темных темах вообще нечитабельный =(

  6. Не подскажите, прозрачность панели задач откуда берется и можно ли ее отключить? А то как то не в тему, при непрозрачных окнах.

    1. Я, к сожалению, не знаю. Но она действительно не в тему, вы правы

  7. Вопрос, правда не по теме, но как у вас получилось установить тему из Windows 8 Release Preview на RTM?

  8. с:\windows\resources
    themes переименовал в themes.bak
    копирую туда themes из RP
    перегружаюсь
    ничего не меняется 🙁
    что не так делаю?

  9. Сергей Ткаченко :без вреда для системы — нельзя

    а нельзя ли с Вами пообщаться поподробнее насчет этого вреда? или тут, или по email …
    очень хочется такую вещь сделать

    1. Я не прочь пообщаться, но вот в этом вопросе я не заинтересован, увы. Нет у меня желания менять оформление системы.

  10. Я испортил системные файлы так, чтобы композиция окон не смогла примениться, и Windows 8 переключилась назад в базовый стиль:
    и вот это очень интересно …

  11. Это все радости касаются рамки окон. А есть возможность менять внутренность, как раньше. Зрение не позволяет работать на светлых фонах. Остались возможности менять цвет меню окон, рабочего окна, окон сообщений, выделенной строки меню и т.п.?

    1. Тут два варианта. Либо стороннюю тему в систему ставить, либо родную «Высокий контраст». Твиками DWM содержимое перекрасить, увы, не получится.

  12. roddy20 не получил ответа на свое сообщение, а ведь не только ему интересно, где и как надо портить системные файлы.
    Прошу поделиться способом, с уважением, Ваш некромант.

    1. Я неудачно пропатчил shell32, и DWM перестал запускаться, как и Проводник и куча других программ.
      Это не способ, увы.

Обсуждение закрыто.

css.php