Для этого нет задокументированного API. Это полностью сделано намеренно: этот параметр предназначен для изменения пользователем, а не приложениями. И есть встроенный апплет, который пользователь может использовать для этого: панель управления Personalize.
Но, как и в коде, на который вы намекаете, существует недокументированный API, который вы можете использовать - DwmSetColorizationParameters
. Вам просто нужно тщательно проверить, работает ли ваш код во всех целевых операционных системах, и знать, что он может выйти из строя с любыми новыми версиями Windows и / или любыми обновлениями текущей версии Windows.
Я знаю, что раньше он работал в Windows 7, но я не тестировал его со всеми последними пакетами обновлений и другими обновлениями, и я не знаю, работает ли он в Windows 8. Это все, что вам нужно проверить. Использование недокументированных API - это большая работа.
Но тебе повезло. Кто-то другой уже сделал для вас реверс-инжиниринг. (И, вероятно, другие люди тоже, например человек, написавший код, который вы показываете в своем вопросе. Было бы неплохо отдать им должное. Возможно, это было этот парень?)
Вот как вы это используете:
using System;
using System.Drawing;
using System.Globalization;
using System.Runtime.InteropServices;
class DwmManager
{
private struct DWM_COLORIZATION_PARAMS
{
public uint clrColor;
public uint clrAfterGlow;
public uint nIntensity;
public uint clrAfterGlowBalance;
public uint clrBlurBalance;
public uint clrGlassReflectionIntensity;
public bool fOpaque;
}
[DllImport("dwmapi.dll", EntryPoint = "#127", PreserveSig = false)]
private static extern void DwmGetColorizationParameters(out DWM_COLORIZATION_PARAMS parameters);
[DllImport("dwmapi.dll", EntryPoint = "#131", PreserveSig = false)]
private static extern void DwmSetColorizationParameters(ref DWM_COLORIZATION_PARAMS parameters,
bool unknown);
// Helper method to convert from a Win32 BGRA-format color to a .NET color.
private static Color BgraToColor(uint color)
{
return Color.FromArgb(Int32.Parse(color.ToString("X"), NumberStyles.HexNumber));
}
// Helper method to convert from a .NET color to a Win32 BGRA-format color.
private static uint ColorToBgra(Color color)
{
return (uint)(color.B | (color.G << 8) | (color.R << 16) | (color.A << 24));
}
// Gets or sets the current color used for DWM glass, based on the user's color scheme.
public static Color ColorizationColor
{
get
{
// Call the DwmGetColorizationParameters function to fill in our structure.
DWM_COLORIZATION_PARAMS parameters;
DwmGetColorizationParameters(out parameters);
// Convert the colorization color to a .NET color and return it.
return BgraToColor(parameters.clrColor);
}
set
{
// Retrieve the current colorization parameters, just like we did above.
DWM_COLORIZATION_PARAMS parameters;
DwmGetColorizationParameters(out parameters);
// Then modify the colorization color.
// Note that the other parameters are left untouched, so they will stay the same.
// You can also modify these; that is left as an exercise.
parameters.clrColor = ColorToBgra(value);
// Call the DwmSetColorizationParameters to make the change take effect.
DwmSetColorizationParameters(ref parameters, false);
}
}
}
После того, как вы добавили этот класс в свой проект, вы взаимодействуете с ним через свойство ColorizationColor
. Как говорится в комментариях, структура DWM_COLORIZATION_PARAMS
дает вам много дополнительной информации. Вы можете добавить свойства для получения / установки каждого из этих дополнительных параметров, если хотите. Хотя потребуется немного поэкспериментировать, чтобы точно выяснить, что они делают.
Обратите внимание, что вам также необходимо убедиться, что композиция DWM поддерживается и включена операционной системой хоста перед запуском любой из этих функций. (В противном случае атрибут PreserveSig
обеспечит создание исключения.) Это довольно очевидно, но в любом случае стоит упомянуть. Для этого вам также понадобится эта функция:
[DllImport("dwmapi.dll")]
private static extern int DwmIsCompositionEnabled(ref bool pfEnabled);
person
Cody Gray
schedule
23.07.2013