2013-07-23 41 views
6

我正在考慮製作一個能夠根據電池電量更改Windows 7 aero顏色的程序。我是相當新的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結構給你一個lot更多信息。如果您願意,您可以添加屬性來獲取/設置每個附加參數。儘管需要進行一些實驗才能確切瞭解他們的工作。

請注意,您還需要檢查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

相關問題