当前位置: 首页 > 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…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...

迁移科技3D视觉系统:重塑纸箱拆垛场景的智能革命

一、传统拆垛场景的困局与破局之道 在汽车零部件仓库中&#xff0c;每天有超过2万只异形纸箱需要拆垛分拣。传统人工拆垛面临三大挑战&#xff1a; 效率瓶颈&#xff1a;工人每小时仅能处理200-300件&#xff0c;且存在间歇性疲劳安全隐患&#xff1a;20kg以上重箱搬运导致年…...

Windows开机自动启动中间件

WinSW&#xff08;Windows Service Wrapper 是一个开源的 Windows 服务包装器&#xff0c;它可以帮助你将应用程序打包成系统服务&#xff0c;并实现开机自启动的功能。 一、下载 WinSW 下载 WinSW-x64.exe v2.12.0 (⬇️ 更多版本下载) 和 sample-minimal.xml 二、配置 WinS…...