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_USER\SOFTWARE\Microsoft\Windows\DWM

读取其中的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_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize

与颜色的区别是,这个似乎没有api去获取,至少我没找到23333

我们需要的是控制应用主题是的AppsUseLightTheme,控制系统主题色的SystemUsesLightTheme和控制系统是否开启透明的EnableTransparency这三个字段。

在Win10 1903之前的版本,系统的主题色设置只是控制应用颜色,所以是没有SystemUsesLightTheme这个字段的。在使用的时候一定注意判断字段是否存在。

使用上面的颜色和系统主题色,应该足够我们的应用适配系统颜色了。

我的博客: 超威蓝火

wpf/winform获取windows10系统颜色和主题色的更多相关文章

  1. WPF 精修篇 获取系统颜色和字体样式

    原文:WPF 精修篇 获取系统颜色和字体样式 看效果 <Grid> <Rectangle Fill="{DynamicResource {x:Static SystemCo ...

  2. [Winform][C#]获取系统颜色预定义颜色和现有字体集

    转自: http://zhidao.baidu.com/link?url=ozY7tJRNBYHUsImE6jn1psqc8owib7MWcDMEmZw48q8iD9Hz9MWgnQQcBDO0VYO ...

  3. Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform

    Expression构建DataTable to Entity 映射委托   1 namespace Echofool.Utility.Common { 2 using System; 3 using ...

  4. C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式

    C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式 C#实现自动启动的方法-两种方法 源码下载地址: ...

  5. uwp 用win2d获取图片主调颜色

    win10在设置颜色里有个从“背景图片中选取一种主题颜色”的选项,还有在很多内容展示软件中都使用了这样的功能. 现在我们需要在 nuget 引用 win2d.uwp 和 Toolkit.uwp 两个库 ...

  6. Windows10系统的Linux子系统中安装MySQL数据库心得

    后端开发童鞋们, 自己开发机用的是Windows系统电脑(台式机或笔记本), 而开发的程序和使用的数据库等要运行在Linux服务器上, 这种情况有木有? 提前声明: 本文并不讨论操作系统的比较, 以及 ...

  7. 怎么关闭win10快速访问功能?关闭Windows10系统快速访问方法

    怎么关闭win10快速访问功能?关闭Windows10系统快速访问方法 Windows10系统的"快速访问"功能很容易泄露电脑中的隐私,用什么方法可以让这个功能消失,避免电脑的个人 ...

  8. C# wpf程序获取当前程序版本

    C# wpf程序获取当前程序版本 /// <summary>         /// 获取当前系统的版本         /// </summary>         /// ...

  9. 创建一个显示所有预定义系统颜色的ListBox

    原文 Creating a ListBox that Shows All Predefined System Colors 该System.Windows.SystemColors类包含了一系列揭露当 ...

随机推荐

  1. SQl Server 中的decimal( m , n )的意思

    create table sc( cno ), sno ), grade ,), primary key(cno,sno), foreign key(cno) references cou(cno), ...

  2. Codeforces Round #590 D. Distinct Characters Queries

    CF上给的标签是数据结构.但给的题解里的方法是很巧的暴力,用vector<set>维护每个字母出现的下标,每次修改加下标,擦下标.每次询问对每个字母分别lower_bound查找区间内是否 ...

  3. APP自动化针对PO模式进行二次封装之basepage

    APP自动化跟WEB自动化所使用的框架基本一样,都是采用的PO模式结合pytest框架编写自动化测试脚本,为了提高代码的复用性.稳定性和易维护性,我们针对PO模式进行了二次封装,将日志,等待以及异常截 ...

  4. Oracle - SPM固定执行计划(二)

    一.前言 前面文章(https://www.cnblogs.com/ddzj01/p/11365541.html)给大家介绍了当一条sql有多个执行计划时,如何通过spm去绑定其中一条执行计划.本文将 ...

  5. 多进程操作-进程锁multiprocess.Lock的使用

    多进程操作-进程锁multiprocess.Lock的使用 ​ 通过之前的Process模块的学习,我们实现了并发编程,虽然更加充分地利用了IO资源,但是也有缺陷:当多个进程共用一份数据资源的时候,就 ...

  6. (转)Skyline timeseries异常判定算法

    原文链接:https://jiroujuan.wordpress.com/2013/10/09/skyline-anomalous-detect-algorithms/ Skyline内部提供了9个预 ...

  7. Vue结合后台导入导出Excel问题详解

    话不多说,直接上前端代码 axios({ method: 'post', url: 'http://localhost:19090/exportUser',//这个是请求的地址 params: {// ...

  8. easyui textbox setValue以及setText的使用技巧

    1.先赋值Value,后赋值Text $('#Name').textbox('setValue', "11");$('#Name').textbox('setText', &quo ...

  9. 微信小程序的bindtap事件

    在微信小程序中,要想获取元素的属性值,需要用到 bindtap事件,如果想要正确获取到属性值,对属性的命名还有一定要求 如下是正确的方式data-money-Num="9.93": ...

  10. 对java的几点个人浅浅的认知

    特点   简单地说,Java 具有如下特点:简单的.面向对象.平台无关.多线程.分布式.安全. 高性能.可靠的.解释型.自动垃圾回收等特点. 主要面向internet的语言 Java比其他任何一门语言 ...