[Win32] 窗体暗色模式, C++, WinForm, WPF 使用方法, 判断颜色模式, 响应颜色变更消息, 设置标题栏暗色.

2023 年了, 如果咱写的程序还不支持暗色模式, 那就说不过去了.

判断是否是暗色模式

在 Windows 中判断当前系统的颜色模式是否是暗色, 可以通过查询注册表项来实现.

下面是 C++ 的示例代码:

HKEY hKey;
const wchar_t* subKey = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize";
const wchar_t* valueName = L"AppsUseLightTheme";
DWORD value = -1;
DWORD valueSize = sizeof(DWORD);
if (RegOpenKeyEx(HKEY_CURRENT_USER, subKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
{
    HRESULT hr = RegGetValue(hKey, nullptr, valueName, RRF_RT_REG_DWORD, nullptr, &value, &valueSize);
    if (hr != S_OK)
    {
        value = -1;    // 不要假定该键必须存在,如果找不到将返回默认值
    }
    RegCloseKey(hKey);
}

if (value == 0)
{
    // 当前使用暗色主题
}
else if (value == 1)
{
    // 当前使用亮色主题
}
else
{
    // 无法确定当前主题
}

下面是 C# 示例代码:

using Microsoft.Win32;

RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize");
if (key != null)
{
    int appsUseLightTheme = (int)key.GetValue("AppsUseLightTheme", -1);
    if (appsUseLightTheme == 0)
    {
        // 当前使用暗色主题
    }
    else if (appsUseLightTheme == 1)
    {
        // 当前使用亮色主题
    }
    else
    {
        // 无法确定当前主题
    }
    key.Close();
}

设置窗口暗色模式

Windows 中自带了一个暗色模式的 WinAPI, 直接调用就可以将窗口标题栏变成暗色.

下面是 C++ 的示例代码:

#include <windows.h>
#include <dwmapi.h>

int main() {
	HWND hWnd = GetMainWindowHandle(); // 获取主窗口句柄
	DWORD dwAttribute = DWMWA_USE_IMMERSIVE_DARK_MODE; // 设置暗色模式属性
	BOOL bValue = TRUE; // 启用暗色模式
	DwmSetWindowAttribute(hWnd, dwAttribute, &bValue, sizeof(bValue)); // 设置窗口属性

	return 0;
}

下面是 C# 的示例代码:

[DllImport("dwmapi.dll", PreserveSig = true)]
public static extern int DwmSetWindowAttribute(IntPtr hwnd, DwmWindowAttribute attr, ref int attrValue, int attrSize);

public static bool EnableDarkModeForWindow(IntPtr hWnd, bool enable)
{
	int darkMode = enable ? 1 : 0;
	int hr = DwmSetWindowAttribute(hWnd, DwmWindowAttribute.UseImmersiveDarkMode, ref darkMode, sizeof(int));
	return hr >= 0;
}

public enum DwmWindowAttribute : uint
{
	NCRenderingEnabled = 1,
	NCRenderingPolicy,
	TransitionsForceDisabled,
	AllowNCPaint,
	CaptionButtonBounds,
	NonClientRtlLayout,
	ForceIconicRepresentation,
	Flip3DPolicy,
	ExtendedFrameBounds,
	HasIconicBitmap,
	DisallowPeek,
	ExcludedFromPeek,
	Cloak,
	Cloaked,
	FreezeRepresentation,
	PassiveUpdateMode,
	UseHostBackdropBrush,
	UseImmersiveDarkMode = 20,
	WindowCornerPreference = 33,
	BorderColor,
	CaptionColor,
	TextColor,
	VisibleFrameBorderThickness,
	SystemBackdropType,
	Last
}

响应配色更改

当系统配色更改的时候, 会向所有窗体发送一个 THEMECHANGED 消息:

C++ 中, 你可以在 WndProc 捕捉这个消息, 然后进行具体操作. 例如上面提到的, 设置窗口暗色模式.

#include <Windows.h>
#include <iostream>

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int main() {
    // 注册窗口类
    WNDCLASS wc = {};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = GetModuleHandle(NULL);
    wc.lpszClassName = L"MyWindowClass";
    if (!RegisterClass(&wc)) {
        std::cerr << "Failed to register window class" << std::endl;
        return 1;
    }

    // 创建窗口
    HWND hwnd = CreateWindow(
        L"MyWindowClass",
        L"My Window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, GetModuleHandle(NULL), NULL
    );
    if (!hwnd) {
        std::cerr << "Failed to create window" << std::endl;
        return 1;
    }

    // 显示窗口
    ShowWindow(hwnd, SW_SHOWDEFAULT);

    // 消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    case WM_THEMECHANGED:
        std::cout << "Theme changed" << std::endl;
        return 0;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

C# 的话, 如果你在使用 WinForm 或 WPF, 你可以直接使用 C# 封装好的 SystemEvents 类, 它有一个 UserPreferenceChanged 事件, 通过订阅这个事件, 并判断具体分类, 最后执行操作:

SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;

private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
{
    if (e.Category == UserPreferenceCategory.General)
    {
        // 更新颜色主题
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/8096.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

看完这篇 教你玩转渗透测试靶机vulnhub——My File Server: 2

Vulnhub靶机My File Server: 2渗透测试详解Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;FTP匿名登入③&#xff1a;SSH私钥登入④&#xff1a;SMB共享…

Mysql一条多表关联SQL把CPU打爆了,如何优化

今天是清明假期的第三天&#xff0c;收到同事的求助&#xff0c;DB的CPU被打爆了&#xff01; 查看监控&#xff0c;CPU已经被打爆100% 登录mysql&#xff0c;DB无锁阻塞&#xff0c;元凶是一个异常sql,存在39个并发执行。 SQL的明细如下&#xff1a; select TEMPSALE.USER_ID…

ChatGPT 被大面积封号,到底发生什么了?

意大利数据保护机表示 OpenAI 公司不但非法收集大量意大利用户个人数据&#xff0c;没有设立检查 ChatGPT 用户年龄的机制。 ChatGPT 似乎正在遭遇一场滑铁卢。 3月31日&#xff0c; 大量用户在社交平台吐槽&#xff0c;自己花钱开通的 ChatGPT 账户已经无法登录&#xff0c;更…

港科夜闻|香港科大(广州)熊辉教授获委任为协理副校长(知识转移)

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、香港科大(广州)熊辉教授获委任为协理副校长(知识转移)。在任期间&#xff0c;熊教授将为香港科大知识转移战略发展提供全面领导&#xff0c;鼓励和促进教师、学生和校友之间的知识转移&#xff0c;促进创业发展、技术研究及…

数据仓库、数据集市、数据湖,你的企业更适合哪种数据管理架构?

建设企业级数据平台&#xff0c;首先需要了解企业数据&#xff0c;确认管理需求&#xff0c;并选择一个数据管理架构。那么面对纷繁复杂的数据来源&#xff0c;多元化的数据结构&#xff0c;以及他们的管理使用需求&#xff0c;企业数据平台建设该从何处入手呢&#xff1f;哪个…

机器学习笔记之正则化(二)权重衰减角度(直观现象)

机器学习笔记之正则化——权重衰减角度[直观现象]引言回顾&#xff1a;拉格朗日乘数法角度观察正则化过拟合的原因&#xff1a;模型参数的不确定性正则化约束权重的取值范围L1L_1L1​正则化稀疏权重特征的过程权重衰减角度观察正则化场景构建权重衰减的描述过程权重衰减与过拟合…

ChatGPT常用prompts汇总

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

一个开源人的心酸哭诉

编者按&#xff1a;这篇文章比较长&#xff0c;但值得一读。从这篇文章&#xff0c;你可以看到一些开源开发者的内心活动&#xff0c;看看他们的热情、抱负、无奈、心酸、愤怒、失望和痛斥&#xff1b;看看他们如何指责、讽刺、乞求、羞辱那些使用他们作品而无视他们痛苦的人&a…

Java 泛型 使用案例

参考资料 Java 基础 - 泛型机制详解路人甲-Java泛型专题 目录一. 通用Mapper1.1 实体类1.2 Mapper基类1.3 自定义接口1.4 抽象基类Service1.5 调用二. session和bean的获取一. 通用Mapper 1.1 实体类 ⏹ Accessors(chain true): 允许链式调用 import lombok.Data; import …

Python 进阶指南(编程轻松进阶):五、发现代码异味

原文&#xff1a;http://inventwithpython.com/beyond/chapter5.html 导致程序崩溃的代码显然是错误的&#xff0c;但是崩溃并不是发现程序问题的唯一手段。其他迹象可能表明程序存在更微妙的错误或不可读的代码。就像气体的味道可以指示气体泄漏或者烟雾的味道可以指示火灾一样…

[国产化]arm架构的服务器虚拟机软件---Qemu虚拟机

项目场景&#xff1a; 架构&#xff1a;arm 服务器型号&#xff1a;昆泰r522 操作系统&#xff1a;欧拉22.3arm 问题描述 对应需要有arm架构的虚拟机&#xff0c;vmware没有arm版本。寻找替代品。 之前有人介绍可以用zstack。但是需要改变操作系统。所以就放弃了。选择了&…

Github采用Http Push失败

Github采用Http Push失败 Github的密码凭证从2021年起开始就不能用了&#xff0c;现在采用http去push代码时候提示输入的密码要换成令牌&#xff08;token&#xff09;才可以。 如何在Github上生成自己的令牌呢&#xff1f; &#xff08;1&#xff09;简单来说就是将原来输入…

Spring AOP及事务说明

目录 1.事务管理 1.1 事务说明 1.2 Spring事务管理 1.3 事务进阶 (1)Transactional属性说明 (2)rollbackFor属性 (3)propagation属性 1.4 总结 2.AOP 2.1 AOP概述 2.2 AOP核心概念 2.3 AOP进阶 (1) 通知类型 (2)切点表达式 (3) 通知顺序 (4)连接点 1.事务管理 …

电容笔和触控笔有什么区别?第三方电容笔了解下

实际上&#xff0c;这两种不同类型笔&#xff0c;电容笔是适用于电容性屏幕&#xff0c;而触控笔是适用于电阻性屏幕。如果你想买一支带电容笔来搭配IPAD平板&#xff0c;那么苹果的Pencil就会超出你的预算。事实上&#xff0c;平替的电容笔也有很好的表现&#xff0c;并且其的…

【SpringMVC】3—RESTFul风格

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 如果文章对你有所帮助&#xff0c;可以点赞&#x1f44d;…

机器学习 01

目录 一、机器学习 二、机器学习工作流程 2.1 获取数据 2.2 数据集 2.2.1 数据类型构成 2.2.2 数据分割 2.3 数据基本处理 2.4 特征工程 2.4.1什么是特征工程 2.4.2 为什么需要特征工程(Feature Engineering) 2.4.3 特征工程内容 2.5 机器学习 2.6 模型评估 2.7 …

Java代理之jdk动态代理+应用场景实战

本文将先介绍jdk动态代理的基本用法&#xff0c;并对其原理和注意事项予以说明。之后将以两个最常见的应用场景为例&#xff0c;进行代码实操。这两个应用场景分别是拦截器和声明性接口&#xff0c;它们在许多开发框架中广泛使用。比如在spring和mybatis中均使用了拦截器模式&a…

【计算机架构】如何计算 CPU 时间

目录 0x00 响应时间和吞吐量&#xff08;Response Time and Throughput&#xff09; 0x01 相对性能&#xff08;Relative Performance&#xff09; 0x02 执行时间测量&#xff08;Measuring Execution Time&#xff09; 0x03 CPU 时钟&#xff08;Clocking&#xff09; 0x…

【数据结构与算法】并查集

文章目录一、并查集的概念二、并查集的实现2.1 find()的实现2.2 路径压缩算法2.3 join()的实现三、并查集的应用3.1 例题&#xff1a;合并集合3.2 例题&#xff1a;连通块中点的数量四、总结一、并查集的概念 并查集是一个树形结构&#xff0c;所谓的并查&#xff0c;就是当我…

关于神经网络的权重信息和特征图的可视化

目录 1. 介绍 2. 隐藏层特征图的可视化 2.1 AlexNet 网络 2.2 forward 2.3 隐藏层特征图可视化 2.4 测试代码 3. 训练参数的可视化 3.1 从网络里面可视化参数 3.1.1 测试代码 3.1.2 参数的字典信息 3.1.3 参数可视化 3.2 从保存的权重参数文件(.pth)里面可视化参数…
最新文章