有這個沒有記錄的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);
哇。謝謝你。我會在稍後檢查出來,生病回到你身邊。非常感謝。 – Trontor
完美無瑕!我只是不知道以下形式使用了一個結構體:DWM_COLORIZATION_PARAMS dwm = new DWM_COLORIZATION_PARAMS(); – Trontor
@Trontor當然。在C#中,您可以用同樣的方式創建一個新對象,無論它是類還是結構體。所有的結構成員都被初始化爲它們的默認值,對於像uint這樣的數字類型,它是'0'。但是由於您要將引用傳遞給'DwmGetColorizationParameters'函數以使其成員填充,所以這並不重要。 :-) –