没有对此有记录的 API。这完全是设计使然:此设置旨在由user,而不是通过应用程序。用户可以使用一个内置小程序来执行此操作:个性化控制面板。
但就像你得到提示的代码一样,有一个无证的您可以使用的 API —DwmSetColorizationParameters
。您只需要仔细测试您的代码是否可以在所有目标操作系统上运行,并注意它可能会因任何新版本的 Windows 和/或当前版本的 Windows 的任何更新而受到破坏。
我知道它曾经在 Windows 7 中运行,但我没有使用所有最新的服务包和其他更新对其进行测试,也不知道它是否在 Windows 8 中运行。这完全取决于您的测试。使用未记录的 API 是一项繁重的工作。
不过你很幸运。其他人 http://theroadtodelphi.wordpress.com/2011/05/05/changing-the-glass-composition-color-dwm-using-delphi/已经为你完成了逆向工程。 (可能其他人也喜欢编写您在问题中显示的代码的人。给予他们信任会很好。也许是this guy https://stackoverflow.com/a/1813169/366904?)
使用方法如下:
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
结构给你一个lot更多信息。如果您愿意,您可以添加属性来获取/设置每个附加参数。尽管需要进行一些实验才能弄清楚它们到底做了什么。
请注意,您还需要检查主机操作系统是否支持并启用 DWM 组合before运行这些函数中的任何一个。 (否则,PreserveSig
属性将确保抛出异常。)这是相当明显的,但无论如何值得一提。为此,您还需要此功能:
[DllImport("dwmapi.dll")]
private static extern int DwmIsCompositionEnabled(ref bool pfEnabled);