C# 如何通过编程更改Windows 7 Aero/窗口边框颜色?

C# 如何通过编程更改Windows 7 Aero/窗口边框颜色?,c#,aero,dwm,C#,Aero,Dwm,我正在考虑制作一个程序,根据电池电量改变Windows7的aero颜色。我是c#的新手,我想知道如何通过编程更改Windows7 Aero 我有这个密码 [DllImport("dwmapi.dll", EntryPoint = "#127", PreserveSig = false)] public static extern void DwmGetColorizationParameters(out WDM_COLORIZATION_PARAMS

我正在考虑制作一个程序,根据电池电量改变Windows7的aero颜色。我是c#的新手,我想知道如何通过编程更改Windows7 Aero

我有这个密码

[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;
}

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

也许您可以联系这个小型计算机的开发人员。问问他是怎么做的。。我不确定他是否用了
C#
来完成这项任务。但是值得一试


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

没有用于此的文档化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);
      }
   }
}

这是一个很好的教程,但对我这样的人来说并不是很有帮助,因为我没有C++经验,所以标签C是。你认为是正确的,我认为它是用于<代码> C<<代码>,检查我编辑的链接。新链接解释了如何在应用程序上启用它自己,而不是改变窗口的颜色。这是我最后的编辑,我找不到任何其他东西。祝你好运。谢谢你的帮助!哇!谢谢你。我稍后再查,我会给你回电话的。非常感谢。工作完美无瑕!我只是不知道结构的形式是:DWM_COLORIZATION_PARAMS DWM=new DWM_COLORIZATION_PARAMS()@当然可以。在C#中,创建新对象的方式相同,无论是类还是结构。所有结构成员都被初始化为其默认值,对于像
uint
这样的数字类型,默认值是
0
。但是,由于您要将对它的引用传递给
DwmGetColorizationParameters
函数以填充其成员,因此这并不重要。:-)
[DllImport("dwmapi.dll")]
private static extern int DwmIsCompositionEnabled(ref bool pfEnabled);