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

原文: wpf/winform获取windows10系统颜色和主题色

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

WM_DWMCOLORIZATIONCOLORCHANGED = 0x0320

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

AccentColor

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

计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\DWM

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

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

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

ActualTheme

相似的,系统的深色浅色也能够从另外一个注册表位置获取到:orm

计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize

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

相关文章
相关标签/搜索