我有一个应用程序,我想使它的背景色成为默认的Windows 10重音颜色,当用户更改Windows 10的重音颜色时,我希望我的应用程序的背景色也会改变。

发布于 2020-03-15 15:57:29
您需要将UISettings.GetColorValue(UIColorType.Background)作为文档化的这里进行调用。
发布于 2020-03-16 16:41:37
WinForms是一种古老的技术,没有经过太多的更新来支持新的操作系统特性。使用基本的.Net库获取重音颜色没有好的方法(尽管有一个基于注册表的黑客使用无文档的键来检索值)。幸运的是,您可以通过添加NUGET包Microsoft.Windows.SDK.Contracts来访问一些Windows。
添加此包后,您可以创建Windows.UI.ViewManagement.UISettings类的一个实例,然后使用UISettings.GetColorValue(UIColorType)方法检索该值。
要获得值更改的通知,您可以订阅SystemEvents.UserPreferenceChanged事件。此事件将更改归类为UserPreferenceCategory.General类型更改,当旧逻辑不知道更改了什么(同样,旧代码未为新特性更新)时,这种更改是默认的。您可以通过SETTINGCHANGE消息的listenimg检测更改,并检查WParam为null且LParam指向字符串("ImmersiveColorSet")时的变化,但这会对字符串值作出答复,不会更改,也不会比响应所有UserPreferenceCategory.General更改好多少。
综上所述,一个简单的实现如下:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
UserPreferenceChangedEventHandler UserPerferenceChanged = (s, e) =>
{ if (e.Category == UserPreferenceCategory.General || e.Category == UserPreferenceCategory.VisualStyle) BackColor = GetAccentColor(); };
SystemEvents.UserPreferenceChanged += UserPerferenceChanged;
Disposed += (object s, EventArgs e) => { SystemEvents.UserPreferenceChanged -= UserPerferenceChanged; };
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
BackColor = GetAccentColor();
}
static Windows.UI.ViewManagement.UISettings uiSettings = new Windows.UI.ViewManagement.UISettings();
private static System.Drawing.Color GetAccentColor()
{
Windows.UI.Color c = uiSettings.GetColorValue(Windows.UI.ViewManagement.UIColorType.Accent);
return Color.FromArgb(c.A, c.R, c.G, c.B);
}
}发布于 2020-03-15 16:56:27
您可以重写WndProc来处理WM_SETTINGCHANGE消息。
当收到此消息时,您可以确定设置更改是否与检查消息WParam的桌面更改相关:如果是SPI_SETDESKWALLPAPER,则桌面设置已经更改。
背景颜色的更改是这样通知的。
当您获得消息时,颜色值已经更改,因此您可以使用SystemColors.Desktop类检索它:SystemColors返回桌面的当前颜色。
private const int WM_SETTINGCHANGE = 0x001A;
private const int SPI_SETDESKWALLPAPER = 0x0014;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg) {
case WM_SETTINGCHANGE:
if (m.WParam.ToInt32() == SPI_SETDESKWALLPAPER) {
this.BackColor = SystemColors.Desktop;
}
m.Result = IntPtr.Zero;
break;
// other case switches
} https://stackoverflow.com/questions/60694615
复制相似问题