6

我正在考虑制作一个可以根据电池电量更改 Windows 7 航空颜色的程序。我对 c# 相当陌生,我想知道如何以编程方式更改 Windows 7 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;
}

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

4

2 回答 2

10

没有为此记录的 API。这完全是设计使然:此设置旨在由用户更改,而不是由应用程序更改。并且有一个内置的小程序供用户使用:个性化控制面板。

但就像您得到提示的代码一样,您可以使用一个未记录的API —<code>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);
于 2013-07-23T11:18:51.553 回答
1

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

这是我的最终搜索,我找不到其他有用的东西所以......

于 2013-07-23T04:52:54.047 回答