如何用程序更改Windows7Aero/Windows边框颜色

本文关键字:Windows 边框 颜色 Windows7Aero 何用 程序 | 更新日期: 2023-09-27 18:24:16

我正在考虑制作一个程序,根据电池电量改变Windows 7的空气动力学颜色。我对c#相当陌生,我想知道如何以编程方式更改Windows7Aero

我有这个代码

[DllImport("dwmapi.dll", EntryPoint = "#127", PreserveSig = false)]
    public static extern void DwmGetColorizationParameters(out WDM_COLORIZATION_PARAMS                   parameters);
[DllImport("dwmapi.dll", EntryPoint = "#131", PreserveSig = false)]
public static extern void DwmSetColorizationParameters(WDM_COLORIZATION_PARAMS parameters, uint uUnknown);
public struct WDM_COLORIZATION_PARAMS {
    public uint Color1;
    public uint Color2;
    public uint Intensity;
    public uint Unknown1;
    public uint Unknown2;
    public uint Unknown3;
    public uint Opaque;
}

虽然,我不知道如何使用它和设置自定义颜色。

如何用程序更改Windows7Aero/Windows边框颜色

没有相关的API文档。这完全是设计:此设置旨在由用户更改,而不是由应用程序更改。还有一个内置的小程序供用户使用:个性化控制面板。

但是,就像您得到提示的代码一样,有一个未记录的API,您可以使用-DwmSetColorizationParameters。你只需要仔细测试你的代码是否适用于所有目标操作系统,并注意它可能会与任何新版本的Windows和/或当前版本的Windows更新发生冲突。

我知道它曾经在Windows7中运行,但我还没有用所有最新的service Pack和其他更新对它进行测试,我也不知道它是否在Windows8中运行。这一切都取决于你的测试。使用未记录的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);

也许您可以联系这个小型应用程序的开发人员。问他是怎么做到的……我不确定他是不是用C#做到的。但值得一试。

这是我的最后一次搜索,我找不到其他有用的东西,所以…