当前位置: 首页 > news >正文

DWM 相关实现代码 [自用]

· 1. DWM 缩略图和模糊隐藏实现半透明

#include <windows.h>
#include <dwmapi.h>
#include <string>
#pragma comment(lib, "dwmapi.lib")// 检查 UWP 窗口是否可见
bool IsUWPWindowVisible(HWND hwnd) {DWORD cloaked = 0;DwmGetWindowAttribute(hwnd, DWMWA_CLOAKED, &cloaked, sizeof(cloaked));return (cloaked == 0);
}bool IsBadWindow(HWND hwnd) {wchar_t title[256];wchar_t className[256];GetWindowTextW(hwnd, title, 256);GetClassNameW(hwnd, className, 256);LPCWSTR badTitleList[] = { L"NVIDIA", L"Xaml" };for (LPCWSTR badTitle : badTitleList) {if (wcsstr(title, badTitle) != nullptr) {return true;}}return false;
}void UpdateInfoWindow(HWND infoHwnd, HWND mainHwnd) {if (infoHwnd) {RECT mdrc;GetWindowRect(mainHwnd, &mdrc);// 获取屏幕工作区和任务栏的位置信息RECT rcWorkArea = { 0 };SystemParametersInfoW(SPI_GETWORKAREA, 0, &rcWorkArea, 0);HWND hTrayWnd = FindWindowW(L"Shell_TrayWnd", nullptr);// 计算任务栏是否遮挡信息窗口bool taskbarVisible = false;if (IsWindow(hTrayWnd)&& IsWindowVisible(hTrayWnd)) {RECT tbrc;GetWindowRect(hTrayWnd, &tbrc);if (tbrc.top >= rcWorkArea.bottom && mdrc.bottom + 50 > tbrc.top) {// 任务栏在底部且信息窗口底部超出工作区域底部taskbarVisible = true;}}if (taskbarVisible) {// 将信息窗口移动到窗口上方SetWindowPos(infoHwnd, nullptr, mdrc.left + 10, mdrc.top - 110,mdrc.right - mdrc.left - 25,100, SWP_NOZORDER | SWP_SHOWWINDOW);}else {// 将信息窗口移动到窗口底部SetWindowPos(infoHwnd, nullptr, mdrc.left + 10, mdrc.bottom,mdrc.right - mdrc.left - 25,100, SWP_NOZORDER | SWP_SHOWWINDOW);}}
}LRESULT CALLBACK InfoWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg) {case WM_PAINT: {PAINTSTRUCT ps;HDC hdc = BeginPaint(hwnd, &ps);RECT rc;GetClientRect(hwnd, &rc);// 获取目标窗口信息HWND targetHwnd = (HWND)GetWindowLongPtrW(hwnd, GWLP_USERDATA);if (targetHwnd) {wchar_t title[256];wchar_t className[256];GetWindowTextW(targetHwnd, title, 256);GetClassNameW(targetHwnd, className, 256);wchar_t info[512];swprintf(info, 512, L"Title: %s\nClass: %s\nHandle: 0x%llX",title, className, (UINT_PTR)targetHwnd);// 绘制信息文本SetBkMode(hdc, TRANSPARENT);SetTextColor(hdc, RGB(0, 0, 0));DrawTextW(hdc, info, -1, &rc, DT_LEFT | DT_TOP | DT_NOPREFIX);}EndPaint(hwnd, &ps);return 0;}default:break;}return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {static HTHUMBNAIL thumbnail = NULL;static HWND infoHwnd = NULL;static HWND oldBehindWnd = NULL;// 最小窗口尺寸const int MIN_WIDTH = 100;const int MIN_HEIGHT = 100;switch (uMsg) {case WM_CREATE: {// 创建子窗口用于显示信息HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtrW(hwnd, GWLP_HINSTANCE);const wchar_t INFO_CLASS_NAME[] = L"InfoWindowClass";WNDCLASS wc = {};wc.lpfnWndProc = InfoWindowProc;wc.hInstance = hInstance;wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  // 白色背景wc.lpszClassName = INFO_CLASS_NAME;RegisterClassW(&wc);infoHwnd = CreateWindowExW(WS_EX_TRANSPARENT | WS_EX_NOACTIVATE,  // 扩展窗口样式INFO_CLASS_NAME,                 // 窗口类名nullptr,                         // 窗口标题WS_POPUP,                        // 窗口样式0, 0, 800, 100,                  // 窗口尺寸hwnd, nullptr, hInstance, nullptr);if (infoHwnd == nullptr) {return 0;}SetLayeredWindowAttributes(infoHwnd, RGB(0,0,0), 0, LWA_COLORKEY);// 初始化信息窗口的位置RECT rc;GetWindowRect(hwnd, &rc);SetWindowPos(infoHwnd, nullptr, rc.left + 10, rc.bottom, 0, 0,SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);}case WM_ACTIVATE: {// 查找第一个可见且尺寸不小于最小尺寸的后台窗口HWND hwndBehind = GetWindow(hwnd, GW_HWNDNEXT);while (hwndBehind) {if (IsWindowVisible(hwndBehind)&& IsUWPWindowVisible(hwndBehind)&& !IsBadWindow(hwndBehind)) {RECT rcBehind;GetWindowRect(hwndBehind, &rcBehind);int width = rcBehind.right - rcBehind.left;int height = rcBehind.bottom - rcBehind.top;if (width >= MIN_WIDTH && height >= MIN_HEIGHT) {break;}}hwndBehind = GetWindow(hwndBehind, GW_HWNDNEXT);}if (oldBehindWnd != hwndBehind) {// 注销当前缩略图if (thumbnail) {DwmUnregisterThumbnail(thumbnail);thumbnail = NULL;}if (hwndBehind) {oldBehindWnd = hwndBehind;// 注册后台窗口的缩略图DwmRegisterThumbnail(hwnd, hwndBehind, &thumbnail);RECT rcBehindWnd;GetWindowRect(hwndBehind, &rcBehindWnd);SetWindowPos(hwnd, nullptr,0, 0,rcBehindWnd.right - rcBehindWnd.left,rcBehindWnd.bottom - rcBehindWnd.top + 50,SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW);// 更新缩略图属性RECT rcClient;GetClientRect(hwnd, &rcClient);DWM_THUMBNAIL_PROPERTIES dpt;dpt.dwFlags = DWM_TNP_RECTDESTINATION | DWM_TNP_OPACITY;dpt.rcDestination = rcClient;dpt.opacity = (BYTE)(255 * 0.7);  // 设置透明度为70%DwmUpdateThumbnailProperties(thumbnail, &dpt);// 设置子窗口的用户数据为目标窗口句柄SetWindowLongPtrW(infoHwnd, GWLP_USERDATA, (LONG_PTR)hwndBehind);InvalidateRect(infoHwnd, NULL, TRUE);  // 重新绘制子窗口}else {// 设置子窗口的用户数据为目标窗口句柄SetWindowLongPtrW(infoHwnd, GWLP_USERDATA, (LONG_PTR)NULL);MessageBoxW(NULL,L"没有找到合适窗口", L"提示",MB_OK | MB_ICONINFORMATION |MB_APPLMODAL | MB_TOPMOST);}}return 0;}case WM_DESTROY:if (thumbnail) {DwmUnregisterThumbnail(thumbnail);}PostQuitMessage(0);return 0;case WM_SIZE: {if (thumbnail) {RECT rcClient;GetClientRect(hwnd, &rcClient);// 窗口大小改变时重新扩展DWM框架到客户区MARGINS margins = { 0, 0, 0, rcClient.bottom - rcClient.top };DwmExtendFrameIntoClientArea(hwnd, &margins);// 更新缩略图属性DWM_THUMBNAIL_PROPERTIES dpt;dpt.dwFlags = DWM_TNP_RECTDESTINATION | DWM_TNP_OPACITY;dpt.rcDestination = rcClient;dpt.opacity = (BYTE)(255 * 0.7);  // 设置透明度为70%DwmUpdateThumbnailProperties(thumbnail, &dpt);}// 更新信息窗口的位置UpdateInfoWindow(infoHwnd, hwnd);return 0;}case WM_MOVE: {// 更新信息窗口的位置UpdateInfoWindow(infoHwnd, hwnd);return 0;}case WM_PAINT: {PAINTSTRUCT ps;HDC hdc = BeginPaint(hwnd, &ps);RECT rc;GetClientRect(hwnd, &rc);// 绘制半透明背景HBRUSH hBrush = CreateSolidBrush(RGB(255, 255, 255));SetBkMode(hdc, TRANSPARENT);FillRect(hdc, &rc, hBrush);DeleteObject(hBrush);EndPaint(hwnd, &ps);return 0;}default:return DefWindowProcW(hwnd, uMsg, wParam, lParam);}return 0;
}int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow) {// 注册窗口类const wchar_t CLASS_NAME[] = L"TransparentWindowClass";WNDCLASS wc = {};wc.lpfnWndProc = WindowProc;wc.hInstance = hInstance;wc.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);  // 防止背景重绘wc.lpszClassName = CLASS_NAME;RegisterClassW(&wc);// 创建窗口HWND hwnd = CreateWindowExW(WS_EX_NOREDIRECTIONBITMAP,  // 扩展窗口样式CLASS_NAME,                 // 窗口类名L"Transparent Window",      // 窗口标题WS_OVERLAPPEDWINDOW,        // 窗口样式CW_USEDEFAULT, CW_USEDEFAULT, 1000, 600,nullptr, nullptr, hInstance, nullptr);if (hwnd == nullptr) {return 0;}// 使用 DWM API 设置毛玻璃效果DWM_BLURBEHIND bb = { 0 };bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;bb.fEnable = TRUE;bb.hRgnBlur = NULL;DwmEnableBlurBehindWindow(hwnd, &bb);// 设置标题栏颜色为深色(示例为灰色)COLORREF grey = RGB(30, 30, 30);DwmSetWindowAttribute(hwnd, DWMWA_CAPTION_COLOR, &grey, sizeof(grey));// 显示窗口ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);// 消息循环MSG msg = {};while (GetMessageW(&msg, nullptr, 0, 0)) {TranslateMessage(&msg);DispatchMessageW(&msg);}return 0;
}

效果图:

窗口缩略图实现背景墙(自动识别窗口切换)

窗口切换和大小跟随: 

演示截图 2

· 2. 更多代码......

(...)


本文发布于:2024.07.08

相关文章:

DWM 相关实现代码 [自用]

1. DWM 缩略图和模糊隐藏实现半透明 #include <windows.h> #include <dwmapi.h> #include <string> #pragma comment(lib, "dwmapi.lib")// 检查 UWP 窗口是否可见 bool IsUWPWindowVisible(HWND hwnd) {DWORD cloaked 0;DwmGetWindowAttribute(…...

根据样本数据的区域分布进行重采样

希望根据数据的区域分布进行重采样&#xff0c;通常用于处理空间数据或具有明显区域特征的数据。 文章目录 重采样整体思路数据集重采样步骤 区域划分的方法具体代码案例1. 基于规则的划分2. 基于密度的划分3. 基于层次的划分4. 基于图的划分5. 基于网格的划分6. 基于自组织映射…...

数据库之MQL

1&#xff0c;查询所有 mysql> select * from grade;2&#xff0c; mysql> select id,firstname,lastname from grade;3&#xff0c; mysql> select firstname,lastname from grade where id > 4;4&#xff0c; mysql> select * from grade where sex f;5&…...

LabVIEW平台从离散光子到连续光子的光子计数技术

光子计数技术用于将输入光子数转换为离散脉冲。常见的光子计数器假设光子是离散到达的&#xff0c;记录到来的每一个光子。但是&#xff0c;当两个或多个光子同时到达时&#xff0c;计数器会将其记录为单个脉冲&#xff0c;从而只计数一次。当连续光子到达时&#xff0c;离散光…...

【Linux】Windows平台使用gdb调试FFmpeg源码

FFmpeg是一个跨平台的多媒体库&#xff0c;有时需要在别的平台上进行开发和调试&#xff0c;记录一下在linux环境下使用gdb来调试FFmpeg源码的基本方式 1.可执行文件 在windows平台使用linux环境来调试FFmpeg源码&#xff0c;需要编译生成一个后缀有_g的exe文件&#xff0c;参…...

提交表单form之后发送表单内容到指定邮箱(单php文件实现)

提交各种表单之后&#xff0c;自动将表单的内容通过邮件api接口的形式自动发送到指定的邮箱。步骤如下&#xff1a; 1.在aoksend注册一个账号。 2.绑定一个自己的域名。做域名解析之后验证。验证通过后自动提交审核。等待审核通过。 3.设置一个邮件模板。aoksend内置了一些优…...

【设计模式之美】策略模式方法论:解耦策略的定义、创建和使用

文章目录 一. 策略的定义-封装策略&#xff0c;面向接口二. 策略的创建-创建策略工厂1. 对于无状态策略2. 对于有状态策略 三. 策略的使用&#xff1a;动态选择四. 避免分支判断-策略的优雅1. 对于无状态的策略2. 对于有状态的策略 策略模式是定义一族算法类&#xff0c;将每个…...

解析 pdfminer pdfparser.py

解析 pdfminer pdfparser.py 1. 导入必要的模块2. 定义PDFParser类2.1 初始化方法2.2 设置文档方法2.3 处理关键词方法举例说明: 3. 定义PDFStreamParser类3.1 初始化方法3.2 刷新方法3.3 处理关键词方法 总结 今天我们来看一段Python代码,这段代码实现了一个PDF文件的解析器。…...

day10:03 一文搞懂encode和encoding的区别

在Python中&#xff0c;处理字符串时经常会遇到encode()方法和encoding参数&#xff0c;它们都与字符串的编码和解码有关&#xff0c;但用途和上下文有所不同。下面通过案例来解释它们的关系和区别。 1. encode() 方法 encode()方法是字符串&#xff08;str&#xff09;类型的…...

【wordpress教程】wordpress博客网站添加非法关键词拦截

有的网站经常被恶意搜索&#xff0c;站长们不胜其烦。那我们如何屏蔽恶意搜索关键词呢&#xff1f;下面就随小编一起来解决这个问题吧。 后台设置预览图&#xff1a; 设置教程&#xff1a; 1、把以下代码添加至当前主题的 functions.php 文件中&#xff1a; add_action(admi…...

untiy 在菜单栏添加自定义按钮 点击按钮弹出一个Unity窗口,并在窗口里添加属性

using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEngine.Rendering.PostProcessing;public class AutoGenerateWindow : EditorWindow //这是定义一个窗口 {public string subjecttName "科目名字";//科目的名字public GameOb…...

VIM模式之间的切换

命令行界面下&#xff0c;常用的文本编辑器是 VI / VIM(VI增强版)&#xff0c;VI 是 Linux 最通用的文本编辑器&#xff0c;VIM相较于VI&#xff0c;提供了代码高亮等功能&#xff0c;两者用法完全兼容&#xff1b; 1. 进入 VIM 工作界面 vim 文件名 2. 进入编辑模式 三种方…...

Linux操作系统安全分析与防护

Linux操作系统安全机制 Linux操作系统由于其开放源代码和广泛应用&#xff0c;在服务器和嵌入式系统中占有重要地位。为了确保Linux系统的安全&#xff0c;必须了解并实施一系列有效的安全机制。这些机制包括用户身份验证、访问控制、数据加密、日志和审计、安全更新等。 一、…...

【LeetCode】面试题 16.21. 交换和

质量还不错的一道题&#xff0c;适合用于考察二分法。 1. 题目 2. 分析 求出两个数组的总和&#xff0c;我们令总和少的为less&#xff0c;总和多的为more&#xff1b;如果两个数组的总和是奇数&#xff0c;那么怎么都配不平&#xff0c;直接返回false&#xff1b;如果两个数…...

Web知识库应用程序LibreKB

什么是 LibreKB &#xff1f; LibreKB 是一款知识库 Web 应用程序。免费、开源、自托管&#xff0c;基于 PHP/MySQL。 官方并没有 Docker 镜像&#xff0c;老苏这次图省事&#xff0c;并没有像往常一样构建一个镜像&#xff0c;而是基于 Docker 搭建了一个 LAMP 环境&#xff0…...

神经网络和安全结合:一种基于神经网络的智能攻击检测与防御系统;构建攻击行为预测模型

目录 神经网络和安全结合 摘要 引言 理论基础 技术实现与创新点 实验验证 结论与展望 一种基于神经网络的智能攻击检测与防御系统 一、系统概述 二、主要功能 三、技术特点 四、应用前景 构建攻击行为预测模型 一、构建攻击行为预测模型的步骤 1. 数据收集 2. …...

音视频解封装demo:将FLV文件解封装(demux)得到文件中的H264数据和AAC数据(纯手工,不依赖第三方开源库)

1、README 前言 注意&#xff1a;flv是不支持h.265封装的。目前解封装功能正常&#xff0c;所得到的H.264文件与AAC文件均可正常播放。 a. demo使用 $ make clean && make DEBUG1 $ $ $ ./flv_demux_h264_aac Usage: ./flv_demux_h264_aac avfile/test1.flv./flv_d…...

51单片机(STC8051U34K64)_RA8889_SPI4参考代码(v1.3)

硬件&#xff1a;STC8051U34K64 RA8889开发板&#xff08;硬件跳线变更为SPI-4模式&#xff0c;PS101&#xff0c;R143&#xff0c;R141短接&#xff0c;R142不接&#xff09; STC8051U34K64是STC最新推出来的单片机&#xff0c;主要用于替换传统的8051单片机&#xff0c;与标…...

关于C# 开发Winfrom事后总结

一&#xff1a;要求能读取文件夹中视频及图片并判断 private void Form1_Load(object sender, EventArgs e){string foldPath "路径";//获取该目录下的文件 string[] files Directory.GetFiles(foldPath "\\", "*.*", System.IO.SearchOption…...

Python学习笔记35:进阶篇(二十四)pygame的使用之音频文件播放

前言 基础模块的知识通过这么长时间的学习已经有所了解&#xff0c;更加深入的话需要通过完成各种项目&#xff0c;在这个过程中逐渐学习&#xff0c;成长。 我们的下一步目标是完成python crash course中的外星人入侵项目&#xff0c;这是一个2D游戏项目。在这之前&#xff…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...