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. python爬取图片

    1.导入需要的模块requests,BeautifulSoup,os(用于文件读写). 2.创建一个类,并初始化.   1 2 3 4 5 6 7 8 class BeautifulPicture: ...

  2. [译]Vulkan教程(03)开发环境

    [译]Vulkan教程(03)开发环境 这是我翻译(https://vulkan-tutorial.com)上的Vulkan教程的第3篇. In this chapter we'll set up y ...

  3. Charles 使用笔记

     一.介绍 Charles 属于抓包软件. Charles 多平台支持,mac.windows.linux. Charles 是收费软件,可以免费试用 30 天.试用期过后,未付费的用户仍然可以继续使 ...

  4. centos7编译安装Zabbix-4.2.4及设置邮件告警教程(超详细每步都有截图)

    Zabbix-4.2.4安装及配置 此安装基于centos7的LNMP环境下,如未安装LNMP还可参考本人其他随笔 第一步:上传下载 1.前往https://www.zabbix.com/downlo ...

  5. koa2 从入门到进阶之路 (七)

    之前的文章我们介绍了一下 koa koa-static静态资源中间件,本篇文章我们来看一下 koa 中 cookie 和 session 的使用. cookie 是存储于访问者的计算机中的变量.可以让 ...

  6. 【spring-boot 源码解析】spring-boot 依赖管理梳理图

    在文章 [spring-boot 源码解析]spring-boot 依赖管理 中,我梳理了 spring-boot-build.spring-boot-parent.spring-boot-depen ...

  7. 你看不懂的spring原理是因为不知道这几个概念

    背景 问题从一杯咖啡开始. 今天我去楼下咖啡机买了一杯「粉黛拿铁」.制作过程中显示: 我取了做好的粉黛拿铁,喝了一口,果然就是一杯热巧克力.咦咦咦,说好的拿铁呢?虽然我对「零点吧」的咖啡评价很高,觉得 ...

  8. 在vue组件中设置定时器和清除定时器

    由于项目中难免会碰到需要实时刷新,无论是获取短信码,还是在支付完成后轮询获取当前最新支付状态,这时就需要用到定时器.但是,定时器如果不及时合理地清除,会造成业务逻辑混乱甚至应用卡死的情况,这个时就需要 ...

  9. Python 類和對象 Class vs Object

    類別定義 class 類別名: 例如: >>> class Point:...     x = 0.0...     y = 0.0 1. 宣告 >>> p1 = ...

  10. ABP入门教程2 - 体系架构

    点这里进入ABP入门教程目录 介绍 应用程序代码库的分层是一种广泛接受的技术,可帮助降低复杂性并提高代码可重用性.为了实现分层体系结构,ASP.NET Boilerplate遵循域驱动设计的原理. D ...