Quantcast
Channel: Спецвыпуск — Winreview.ru
Viewing all articles
Browse latest Browse all 13

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

$
0
0

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

Всё, что будет описано в этой статье, в полной мере относится только к 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 происходит чтение ветки реестра

Код: Выделить всё
HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM

Все параметры, которые здесь находятся, имеют тип 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. Обе функции вызываются принимают в качестве входного параметра структуру, соответствующую набору параметров в реестре. Она должна быть описана так:

Код: Выделить всё
        [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;
};

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

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

Код: Выделить всё
[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);

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

Код: Выделить всё
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);
}
}

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

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

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

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

Скачать Aero8Tuner


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


Viewing all articles
Browse latest Browse all 13

Trending Articles