2013-07-23 2 views
6

Я подумываю о создании программы, которая изменит цвет айронов Windows 7 в соответствии с уровнем заряда батареи. Я довольно новыми для C#, и я хотел бы знать, как изменить Windows 7 Aero программнымКак изменить цвет рамки Windows 7 Aero/Window программно?

У меня есть этот код

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

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

ответ

9

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

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

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

Вам повезло. Someone else уже сделал обратную разработку для вас. (.. И, наверное, и другие люди тоже, как человек, который написал код, который вы показать в вашем вопросе Было бы хорошо, чтобы дать им кредит Может быть, это было this guy?)

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

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); 
+0

Ничего себе. Спасибо за это. Я проверю это позже, болью вернемся к вам. Спасибо. – Trontor

+0

Работает безупречно! Я просто не знал, что структура используется в виде: DWM_COLORIZATION_PARAMS dwm = new DWM_COLORIZATION_PARAMS(); – Trontor

+1

@Trontor Конечно. В C# вы создаете новый объект таким же образом, будь то класс или структура. Все элементы структуры инициализируются значениями по умолчанию, которые для числовых типов, таких как 'uint', равны' 0'. Но так как вы собираетесь передать ссылку на функцию 'DwmGetColorizationParameters', чтобы ее члены заполнились, это не имеет большого значения. :-) –

1

Возможно, вы могли бы связаться с разработчиком этого небольшого application. Спросите, как он это сделал. Я не уверен, что он использовал C#, чтобы выполнить это. Но это стоит того.

Это мой последний поиск, я не мог найти что-нибудь еще ПОЛЕЗНЫЕ так ...

+0

Это хороший учебник, но не совсем полезно для кого-то вроде меня, как у меня нет C++ опыта, следовательно, тег C#. – Trontor

+0

Вы правы, я думал, что это для 'C#', проверьте мою отредактированную ссылку. – DeMama

+0

В новой ссылке объясняется, как включить на приложение, а не изменять цвет окна. – Trontor

Смежные вопросы