Как программно изменить цвет границы Windows 7 Aero / Window?

Я думаю о создании программы, которая изменит цвет Windows 7 aero в соответствии с уровнем заряда батареи. Я довольно новичок в 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;
}

хотя, я не знаю, как его использовать и установить пользовательский цвет.

2 ответов


для этого нет документированного API. Это полностью по дизайну: этот параметр предназначен для изменения с помощью пользователей, а не приложений. И есть встроенный апплет для пользователя, чтобы использовать для этого: панель управления персонализацией.

но, как и код, на который у вас есть подсказки, есть без документов API, который вы можете использовать -DwmSetColorizationParameters. Вам просто нужно тщательно проверить, что ваш код работает на всех целевых операционных системах и знать, что он подлежит разрыву с любыми новыми версиями Windows и / или любыми обновлениями к текущей версии Windows.

Я знаю, что он работал в Windows 7, но я не тестировал его со всеми последними пакетами обновления и другими обновлениями, и я понятия не имею, работает ли он в Windows 8. Это все зависит от вас, чтобы проверить. Использование недокументированных API-интерфейсов-это большая работа.

но тебе повезло. чужой уже сделал обратное проектирование для вас. (И вероятно, другие люди тоже, как человек, который написал код, который вы показываете в своем вопросе. Было бы неплохо отдать им должное. Может, так оно и было!--19-->этот парень?)

вот как вы его используете:

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# для этого. Но попробовать стоит.

Это мой поиск, я не мог найти ничего полезного так...