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

C++与VLC制作独属于你的动态壁纸背景

文章目录

  • 前言
    • 效果展示
    • 为什么要做他
    • 如何实现他
    • 实现步骤
      • 获取桌面句柄
      • 代码获取桌面句柄
      • libvlc_media_player_set_hwnd函数
    • 动态壁纸代码
  • 总结


前言

在当今的数字世界中,个性化和自定义化的体验越来越受到人们的欢迎。动态壁纸是其中一种很受欢迎的方式,它不仅可以美化桌面,还能带来生动的视觉体验。利用开源的 VLC 媒体播放器库(libVLC)和 C++,我们可以轻松地创建一个独特的动态壁纸程序,将视频内容直接嵌入到 Windows 的桌面背景中。本篇文章将带你一步步实现这个目标,通过使用 libVLC 的强大功能,将视频作为动态壁纸展示在你的桌面上。


效果展示

在这里插入图片描述

为什么要做他

  1. 用来训练我们使用VLC播放的能力
  2. 我们可以自定义壁纸(虽然wallpaper engine也可以实现这个能力,但是需要购买难免是比较心疼的)

如何实现他

在Windows里面,我们的壁纸其实就和一个窗口差不多,他也有句柄,我们得到他的句柄,然后把视频贴上去就OK了
在VLC中,我们可以使用libvlc_media_player_set_hwnd这个函数把播放的视频贴到一个指定的句柄上
那么我们的目标很明确了:

  1. 获取句柄
  2. 把视频贴上去

实现步骤

获取桌面句柄

在 Windows 系统中,桌面其实是由几个不同的部分组成的。这些部分就像树枝一样,一层一层地构成了整个桌面。

  1. 父窗口:这是整个桌面的基础,它就像树干一样,支撑着其他部分。这个父窗口在 Windows 中叫做 “Program Manager”(Progman)。

  2. 背景:这是你在桌面上看到的图片或颜色,是桌面的底层部分,就像树的枝叶一样覆盖在整个桌面上。

  3. 图标:这些是你桌面上看到的各种文件、文件夹和应用程序的快捷方式,它们显示在背景之上。

在 Windows 系统中,“Program Manager” 包含了一个叫做 “SysListView32” 的窗口,这个窗口专门用来显示桌面上的图标。

如果你能把自己(比如说一个应用程序或窗口)设置在 “Program Manager” 的这个 “SysListView32” 窗口后面,那么你的窗口就会出现在桌面图标的后面,就好像你躲在树叶后面一样。

所以,整个意思是:桌面是由父窗口、背景和图标这三部分组成的,而通过设置父窗口(Program Manager),你可以控制自己窗口的显示位置,从而把它放在桌面图标的后面。

代码获取桌面句柄

我们使用的是Windows的API你先要包含windows.h

HWND FindDTWindow()
{// 找到名为 "Progman" 的顶级窗口句柄,它的窗口标题是 "Program Manager"HWND hWnd = ::FindWindow(L"Progman", L"Program Manager");// 发送一个特殊的消息 (0x052C) 给找到的 "Progman" 窗口// 这条消息会使 Windows 创建一个新的 WorkerW 窗口DWORD_PTR dResult = 0;SendMessageTimeout(hWnd, 0x052C, 0, NULL, SMTO_NORMAL, 1000, &dResult);// 声明一个变量来存储 WorkerW 窗口的句柄HWND hwndWorkW = NULL;// 使用一个 do-while 循环来查找 WorkerW 窗口do {// 查找下一个 WorkerW 窗口hwndWorkW = ::FindWindowEx(NULL, hwndWorkW, L"WorkerW", NULL);if (NULL == hwndWorkW)continue;// 在 WorkerW 窗口中查找 SHELLDLL_DefView 窗口HWND hView = ::FindWindowEx(hwndWorkW, NULL, L"SHELLDLL_DefView", NULL);if (NULL == hView)continue;// 如果找到了 SHELLDLL_DefView 窗口,则尝试关闭多余的 WorkerW 窗口HWND h = ::FindWindowEx(NULL, hwndWorkW, L"WorkerW", NULL);while (NULL != h) {SendMessage(h, WM_CLOSE, 0, 0);h = ::FindWindowEx(NULL, hwndWorkW, L"WorkerW", NULL);}break;} while (true);// 返回 "Progman" 窗口的句柄return hWnd;
}

libvlc_media_player_set_hwnd函数

libvlc_media_player_set_hwnd 是 libVLC 库中的一个函数,用于设置视频输出窗口的句柄 (HWND)。这是在 Windows 平台上使用 libVLC 播放视频时常用的函数。

void libvlc_media_player_set_hwnd(libvlc_media_player_t *p_mi, void *drawable);

函数作用:

这个函数的主要作用是将视频输出重定向到指定的窗口。换句话说,当你使用 libVLC 播放视频时,可以指定一个窗口,让视频显示在该窗口中。

参数和含义:

  • libvlc_media_player_t *p_mi:这是一个指向 libVLC 媒体播放器实例的指针。你需要先创建一个媒体播放器实例,然后将它的指针传递给这个函数。

  • void *drawable:这是一个指向窗口句柄 (HWND) 的指针。在 Windows 平台上,这个句柄指向你希望视频输出的窗口。

动态壁纸代码

#include <iostream>// 避免 ssize_t 引发的错误
#if defined(_MSC_VER)
#include <basetsd.h>
typedef SSIZE_T ssize_t;
#endif#include <vlc/vlc.h>
#include <thread>
#include <Windows.h>using namespace std;HWND FindDTWindow()
{HWND hWnd = ::FindWindow(L"Progman", L"Program Manager");DWORD_PTR dResult = 0;SendMessageTimeout(hWnd, 0x052C, 0, NULL, SMTO_NORMAL, 1000, &dResult);HWND hwndWorkW = NULL;do {hwndWorkW = ::FindWindowEx(NULL, hwndWorkW, L"WorkerW", NULL);if (NULL == hwndWorkW)continue;HWND hView = ::FindWindowEx(hwndWorkW, NULL, L"SHELLDLL_DefView", NULL);if (NULL == hView)continue;HWND h = ::FindWindowEx(NULL, hwndWorkW, L"WorkerW", NULL);while (NULL != h) {SendMessage(h, WM_CLOSE, 0, 0);h = ::FindWindowEx(NULL, hwndWorkW, L"WorkerW", NULL);}break;} while (true);return hWnd;
}// 等待播放结束(完整播放)
void waitPlaying(libvlc_media_player_t* mp)
{libvlc_state_t state;do {state = libvlc_media_player_get_state(mp);} while (state != libvlc_Error && state != libvlc_Ended);
}void playerMedia(const char* path)
{libvlc_instance_t* vlc = libvlc_new(0, NULL);libvlc_media_t* md = libvlc_media_new_path(vlc, path);//libvlc_media_new_location(vlc, path);libvlc_media_player_t* mp = libvlc_media_player_new_from_media(md);libvlc_media_player_set_media(mp, md);HWND hWnd = FindDTWindow();// 设置句柄libvlc_media_player_set_hwnd(mp, hWnd);// 开始播放libvlc_media_player_play(mp);// 等待播放结束waitPlaying(mp);// 释放资源libvlc_media_release(md);libvlc_media_player_release(mp);libvlc_release(vlc);
}int main()
{playerMedia("./a5.mp4"); //RTSP、HTTP ...;return 0;
}

总结

通过本文的讲解,我们成功地利用 C++ 和 libVLC 创建了一个独特的动态壁纸程序。这个程序不仅能美化你的桌面,还能为你带来全新的视觉享受。libVLC 提供了强大的多媒体处理能力,而 C++ 的灵活性则使我们能够充分利用这些功能,实现高度自定义的应用程序。希望通过本文,你不仅学会了如何使用 libVLC 和 C++ 创建动态壁纸,还能激发更多关于个性化桌面体验的创意和想法。让你的桌面更加生动,展示属于你的独特风格。

相关文章:

C++与VLC制作独属于你的动态壁纸背景

文章目录 前言效果展示为什么要做他如何实现他实现步骤获取桌面句柄代码获取桌面句柄libvlc_media_player_set_hwnd函数 动态壁纸代码 总结 前言 在当今的数字世界中&#xff0c;个性化和自定义化的体验越来越受到人们的欢迎。动态壁纸是其中一种很受欢迎的方式&#xff0c;它…...

平凯星辰黄东旭出席 2024 全球数字经济大会 · 开放原子开源数据库生态论坛

7 月 5 日&#xff0c;以“开源生态筑基础&#xff0c;数字经济铸未来”为主题的 2024 全球数字经济大会——开放原子开源数据库生态论坛在北京成功举办。平凯星辰&#xff08;北京&#xff09;科技有限公司联合创始人黄东旭发表了题为《TiDB 助力金融行业关键业务系统实践》的…...

Mac OS 下安装 NVM,1秒教会你

1.下载 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash或者wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash 2.安装成功后执行 nvm 提示 command not found 首先查看 ~/.bash_profile 文件是否存在&…...

搭建博客系统#Golang

WANLI 博客系统 项目介绍 基于vue3和gin框架开发的前后端分离个人博客系统&#xff0c;包含md格式的文本编辑展示&#xff0c;点赞评论收藏&#xff0c;新闻热点&#xff0c;匿名聊天室&#xff0c;文章搜索等功能。 点击跳转&#xff1a;Github 项目开源地址 功能展示 B 站…...

算法——滑动窗口(day6)

1004.最大连续1的个数 ||| 1004. 最大连续1的个数 III - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a; 这道题如果能转化为滑动窗口的话就会很简单&#xff0c;因为我们如果尝试去把0翻转为1再计数的话等到第2轮又得重新翻转回来&#xff0c;费时费力~ 那么我…...

推荐一款基于Spring Boot 框架开发的分布式文件管理系统,功能齐全,非常便捷(带私活源码)

前言 在数字化时代&#xff0c;文件管理是企业和个人用户的基本需求。然而&#xff0c;现有的文件管理系统往往存在一些痛点&#xff0c;如存储空间有限、文件共享困难、缺乏在线编辑功能、移动端适配性差等。这些问题限制了用户在不同设备和场景下的文件处理能力。 为了解决…...

Mysql-查询

1.基本查询 //查询所有内容 select * from 表名;//查询指定字段 select 字段1&#xff0c;字段2&#xff0c;字段3.....from 表名;//查询时给字段起别名 select 字段1 as 别名1 , 字段2 as 别名2 ... from 表名&#xff1b;//去重查询 select distinct 字段列表 from 表名; …...

广东科学技术职业学院计算机学院领导一行莅临泰迪智能科技参观交流

7月17日&#xff0c;广东科学技术职业学院计算机学院副院长张军、计算机学院副书记吴国庆、计算机学院大数据教学部部长谢文达、科技与校企合作部副部长黄相杰、科技与校企合作部副部长吴胜兵莅临广东泰迪智能科技股份有限公司产教融合实训基地参观交流&#xff0c;泰迪智能科技…...

exo 大模型算力共享;Llama3-70B是什么

目录 exo 大模型算力共享 exo框架的特点 如何使用exo框架 注意事项 结论 Llama3-70B是什么 一、基本信息 二、技术特点 三、性能与应用 四、未来发展 exo 大模型算力共享 exo框架的特点 异构支持:支持多种不同类型的设备,包括智能手机、平板电脑、笔记本电脑以及高…...

测试——Junit

内容大纲: 常用的五个注解 测试用例顺序指定 参数化 测试套件 断言 1. 常用的五个注解 1.1 Test 通常情况下,我们输入要写在main方法下,此时我想直接输出: Test void Test01(){System.out.println("第一个测试用例"); } 1.2 BeforeAll AfterAll BeforeALL在Tes…...

BUG ImportError: cannot import name ‘QAction‘ from ‘PySide6.QtWidgets‘

BUG ImportError: cannot import name ‘QAction’ from ‘PySide6.QtWidgets’ 环境 PySide6 6.7.2详情 在参考 PyQt5 的代码写 Pyside6 的右键菜单时遇到的错误。 错误代码 from PySide6.QtWidgets import QAction错误原因&#xff1a; 在PySdie6中&#xf…...

对某次应急响应中webshell的分析

文章前言 在之前处理一起应急事件时发现攻击者在WEB应用目录下上传了webshell&#xff0c;但是webshell似乎使用了某种加密混淆手法&#xff0c;无法直观的看到其中的木马连接密码&#xff0c;而客户非要让我们连接webshell来证实此文件为后门文件且可执行和利用(也是很恼火&a…...

Vue3新特性

Vue3新特性 1、Composition API1.1 什么是 Composition API1.2 常用 Composition API1.2.1 setup1.2.2 ref1.2.3 reactive1.2.4 computed1.2.5 watchEffect、watchPostEffect、watchSyncEffect1.2.6 watch 2、生命周期2.1 Vue3生命周期钩子2.2 vue2 和 vue3 关于生命周期的对比…...

一套功能齐全、二开友好的即时通讯IM工具,提供能力库和UI库,支持单聊、频道和机器人(附源码)

前言 在当今数字化时代&#xff0c;即时通讯(IM)和实时音视频(RTC)功能已成为众多应用的标配。然而&#xff0c;现有的解-决方案往往存在一些痛点&#xff0c;如架构落后、成本高昂、数据安全性和隐私保护不足&#xff0c;以及二次开发和部署的复杂性。 为了解决这些问题&…...

MySQL:JOIN 多表查询

多表查询 在关系型数据库中&#xff0c;表与表之间是有联系的&#xff0c;它们通过 外键 联系在一起&#xff0c;所以在实际应用中&#xff0c;经常使用多表查询。多表查询就是同时查询两个或两个以上的表。 MySQL多表查询是数据库操作中非常重要的一部分&#xff0c;它允许你…...

【机器学习】必会算法模型之:一文掌握 密度聚类,建议收藏。

密度聚类 1、引言2、密度聚类2.1 定义2.2 核心原理2.3 实现步骤2.4 算法公式2.5 代码示例 3、总结 1、引言 在机器学习的无监督学习领域&#xff0c;聚类是一项基础而重要的任务。 聚类算法通过将数据点分组&#xff0c;使同一组内的数据点具有更大的相似性&#xff0c;而组间…...

代码:前端与数据库交互的登陆界面

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>登录</title> </head> <body>…...

发电机基础知识:负载组

什么是发电机负载组&#xff1f; 简单地说&#xff0c;负载组是一种可以产生人工电力负载的设备&#xff0c;用于测试发电机并验证发电机组的性能&#xff0c;包括相关组件&#xff0c;以确保通过使发电机发动机达到适当的工作温度和压力来满足适当的负载。 它是如何工作的&a…...

内网安全:各类密码的抓取

Mimikatz在线读取SAM文件 离线读取SAM文件 在线读取lsass进程 离线读取lsass进程 BrowserGhost浏览器密码抓取 Sharp-HackBrowserData浏览器密码抓取 SharpDecryptPwd数据库密码抓取 LaZagne各类密码的抓取 Windows其他类型抓NTLM Hash工具 sam文件和lsass进程就是Wind…...

前端面试题汇总2

1. CSS 中两个 .class1 .class2 从哪个开始解析 在 CSS 中&#xff0c;选择器 .class1 .class2 表示所有 class 为 class1 的元素中的 class 为 class2 的子元素。浏览器解析这个选择器时&#xff0c;从右向左解析。也就是说&#xff0c;浏览器首先找到所有 class 为 class2 的…...

分布式服务框架zookeeper+消息队列kafka

一、zookeeper概述 zookeeper是一个分布式服务框架&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;命名服务&#xff0c;状态同步&#xff0c;配置中心&#xff0c;集群管理等。 在分布式环境下&#xff0c;经常需要对应用/服…...

服务攻防-应用协议cve

Cve-2015-3306 背景&#xff1a; ProFTPD 1.3.5中的mod_copy模块允许远程攻击者通过站点cpfr和site cpto命令读取和写入任意文件。 任何未经身份验证的客户端都可以利用这些命令将文件从文件系统的任何部分复制到选定的目标。 复制命令使用ProFTPD服务的权限执行&#xff0c;…...

Springcloud之gateway的使用详解

官网地址&#xff1a;https://docs.spring.io/spring-cloud-gateway/docs/4.0.4/reference/html/ 1.网关入门 helloword 网关不依赖start-web 导入的pom&#xff1a; <!--gateway--> <dependency><groupIdorg.springframework.cloud</groupId><arti…...

中望CAD 建筑 v2024 解锁版下载、安装教程 (超强的CAD三维制图)

前言 中望CAD建筑版是一款国产CAD制图软件&#xff0c;专注于建筑设计领域。中望CAD建筑版拥有丰富多样的建筑图块和图案&#xff0c;完美兼容各类建筑图纸。同时&#xff0c;它提供了绘图标准规范&#xff0c;使绘图更加规范和专业。更值得一提的是&#xff0c;该软件还具备智…...

windows edge自带的pdf分割工具(功能)

WPS分割pdf得会员&#xff0c;要充值&#xff01;网上一顿乱找&#xff0c;发现最简单&#xff0c;最好用&#xff0c;免费的还是回到Windows。 Windows上直接在edge浏览器打开PDF&#xff0c;点击 打印 按钮,页面下选择对应页数 打印机 选择 另存为PDF&#xff0c;然后保存就…...

HTML5实现好看的天气预报网站源码

文章目录 1.设计来源1.1 获取天气接口1.2 PC端页面设计1.3 手机端页面设计 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_4…...

比较(八)利用python绘制指示器

比较&#xff08;八&#xff09;利用python绘制指示器 指示器&#xff08;Indicators&#xff09;简介 指示器是一系列相关图的统称&#xff0c;主要用于突出展示某一变量的实际值与目标值的差异&#xff0c;例如常见的数据delta、仪表盘、子弹图、水滴图等。 快速绘制 基于p…...

【体外诊断】ARM/X86+FPGA嵌入式计算机在医疗CT机中的应用

体外诊断 信迈科技提供基于Intel平台、AMD平台、NXP平台的核心板、2.5寸主板、Mini-ITX主板、4寸主板、PICO-ITX主板&#xff0c;以及嵌入式准系统等计算机硬件。产品支持GAHDMI等独立双显&#xff0c;提供丰富串口、USB、GPIO、PCIe扩展接口等I/O接口&#xff0c;扩展性强&…...

力扣 28找到字符串中第一个匹配项的下标 KMP算法

思路&#xff1a; 朴素匹配有很多步骤是多余的 KMP算法能够避免重复匹配 KMP算法主要是根据子串生成的next数组作为回退的依据&#xff0c;它记录了模式串与主串(文本串)不匹配的时候&#xff0c;模式串应该从哪里开始重新匹配。 这里讲一下为什么用模式串的最大公共前后缀…...

JavaScript(10)——匿名函数

匿名函数 没有名字的函数&#xff0c;无法直接使用。 使用方式: 函数表达式立即执行函数 函数表达式 将匿名函数赋值给一个变量&#xff0c;并且通过变量名称进行调用 let fn function(){ 函数体 } 调用&#xff1a; fn() 立即执行函数 语法&#xff1a; (function () {…...

杭州网站建设公司有哪些/新闻最新热点

今天在配置完定时器以后&#xff0c;为了查看实际多久进一次中断&#xff0c;在keil中设置断点来查看了下&#xff0c;结果发现与配置的200ms中断一次差了5个ms 之后把自动重载值减去1&#xff0c;发现误差减小到了50us&#xff0c;整整两个数量级的误差&#xff01; 之后又使…...

怎么生成网页链接/seo关键词排名优化专业公司

小白鱼学习笔记汇总(2019.09-2020-08) 这是过去近一年( 2019.09-2020-08 ),小白鱼公众号所有技术类推文的汇总。 小白鱼公众号创建于 2019 年 9 月中旬,其实现在离一周年还差 1 个月。但是实在是来不及等到 9 月份了,就当是个“伪周年纪念”吧 …… 尽管如此,这也是辛辛苦苦…...

商务网站系统中支付功能怎么做/广州网站建设费用

shutdown命令可以用来进行关闭系统&#xff0c;并且在关机以前传送讯息给所有使用者正在执行的程序&#xff0c;shutdown 也可以用来重开机使用者权限&#xff1a;管理员用户 语法如下&#xff1a; shutdown [-t seconds] [-rkhncfF] time [message] 参数说明&#xff1a; …...

网站建设和app开发/获取排名

这一篇我们先了解一下基本知识&#xff0c;这样对我们后面的学习更加有帮助 。 Socket&#xff0c;WebSocket&#xff0c;Http&#xff0c;Tcp等这些我们已经听的耳朵有茧了&#xff0c;但是用得时候还是复习一下吧。 大学学习网络基础的时候老师讲过&#x…...

桂林网站建设官网/短视频seo排名

实战需求 macOS SwiftUI 组件之优雅展示程序开源项目的组件List收起与展开 本文价值与收获 看完本文后,您将能够作出下面的界面 看完本文您将掌握的技能 实现list收起和展开实现预览文件实现点击挑战实战代码 1、主界面 mport SwiftUIimport LicensedComponentsUIstruct …...

铜仁市城乡住房与建设局网站/网页设计效果图及代码

我有一些带有Twitter风格#hashtags的文本.我将如何编写一个函数来解析可能包含无限数量的#hashtags的文本正文,获取#hashtags的文本并将其全部替换为< a href “ tag / [hashtag text]”> [标签文本]< / a>我已经考虑了很多方法,但是我真的不擅长用regex编写这类函…...