• wpf/winform获取windows10系统颜色和主题色


    Windows10开始微软在系统颜色中添加了深色,对于UWP来说很轻松就能获取到系统当前的颜色和主题色,而对于Win32应用就没有那么直观了。
    在wpf中,可以通过SystemParameters.WindowGlassBrush获取一个近似的颜色,也没办法跟随着系统颜色的变化而变化,对于强迫症来说这是难以忍受的。
    其实系统颜色发生改变的时候,系统会给所有应用程序窗口发送颜色改变的消息,只要正确处理这个消息就能获取到系统当前的颜色和主题色了。

    WM_DWMCOLORIZATIONCOLORCHANGED = 0x0320
    

    当然还可以使用一个更简单的方法。如果你在使用.Net Framework,应该可以直接使用;如果你在使用.Net Core版本的wpf和winform,需要使用nuget安装Microsoft.Win32.SystemEvents
    之后监听SystemEvents.UserPreferenceChanged事件,当主题或颜色被改变时事件将会被触发。当然,还有很多情况这个事件会被触发,需要我们响应的时候判断一下颜色是不是真的改变了。

    AccentColor

    获取颜色有使用DwmGetColorizationParameters api和读取注册表两种方式,我的建议是通过读取注册表来获取颜色。因为DwmGetColorizationParameters这个api是未公开的,微软指不定什么时候就删掉了(虽然可能性极小)。
    关于DwmGetColorizationParameters的使用方式请自行必应,我们在这里使用读取注册表的方式。注意如果使用.Net Core,需要使用nuget安装Microsoft.Win32.Registry。注册表路径为:

    计算机HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsDWM
    

    读取其中的ColorizationColor字段,格式为0xAARRGGBB,下面给出一个简单的转换示例:

    private Color ConvertToColor(int value)
    {
        return Color.FromArgb(
            (byte)(value >> 24),
            (byte)(value >> 16),
            (byte)(value >> 8),
            (byte)value
        );
    }
    

    这个路径下还有很多其他的字段,诸如是否开启透明,混合颜色之类的,对于Win10已经没有效果了,我们不用去管它。

    ActualTheme

    类似的,系统的深色浅色也可以从另一个注册表位置获取到:

    计算机HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersionThemesPersonalize
    

    与颜色的区别是,这个似乎没有api去获取,至少我没找到23333
    我们需要的是控制应用主题是的AppsUseLightTheme,控制系统主题色的SystemUsesLightTheme和控制系统是否开启透明的EnableTransparency这三个字段。
    在Win10 1903之前的版本,系统的主题色设置只是控制应用颜色,所以是没有SystemUsesLightTheme这个字段的。在使用的时候一定注意判断字段是否存在。
    使用上面的颜色和系统主题色,应该足够我们的应用适配系统颜色了。
    我的博客: 超威蓝火

  • 相关阅读:
    idea控制台乱码- tomcat-解决方案
    MySQL-事务面试题
    【实验4】函数和数组
    【实验3】C语言分支语句和循环语句编程应用
    【实验二】C语言表达式编程应用及输入输出函数
    【实验1】(任务四:测试你对非己因素的依赖程度)
    Python操作SQL
    SQL简单记录
    GUI编程 SMTP发送邮件实体化窗口
    Python GUI编程封装代码为exe应用窗口
  • 原文地址:https://www.cnblogs.com/blue-fire/p/11874519.html
Copyright © 2020-2023  润新知