编写一个小而强大的 Windows 动态屏保壁纸
写在前面
两年前我做了第一个开源软件 DreamScene2 动态桌面,如今受到了很多人的喜欢,这增加了我继续做好开源软件的信心。之前的这个软件一直有人希望我加入一个设置屏保壁纸的功能,因为 DreamScene2 就是一个单纯的动态桌面的软件,所以一直没有加入这个功能。今天我带来一个新的开源软件,软件依然是小而强大,简洁并且快速。
欢迎 Star 和 Fork: https://github.com/he55/SonomaWallpaper
介绍
Sonoma Wallpaper 是首款将 macOS Sonoma 4k 120 帧动态屏保壁纸带到 Windows 11 的软件,壁纸包含了自然景观、城市景观、水下景观和地球四个主题的屏保共有 134 个 4k 屏保壁纸。
功能
- 4k 120 帧率视频播放
- 多语言
- 高 dpi 支持
- 深色模式
- 多任务下载
- Windows 11 支持
如何使用
选中已下载的视频壁纸,然后打开 显示为屏幕保护程序 开关,程序会在 2 分钟系统无操作时自动播放屏保壁纸。
下载壁纸
- 选择一个壁纸点击下载
- 等待壁纸下载完成
- 壁纸下载完成后,可以点击预览按钮看效果
视频播放功能代码
在解码 4k 120 帧视频的时候我试过 VLC、迅雷的 APlayer、mpv、ffmpeg、PotPlayer 这些引擎或播放器,发现在 Windows 10 上它们对 120 帧视频支持的都不好。最后发现 Windows 11 已经原生支持了 120 帧视频播放,但只有 UWP 和 WinUI3 程序原生支持。WPF 要使用 UWP 的控件需要安装 Microsoft.Toolkit.Wpf.UI.XamlHost 这个 NuGet 包,这个包可以让 Win32 程序调用 UWP 的控件。包安装后在 xaml 文件中添加名称空间 xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost",然后添加 WindowsXamlHost 控件用来显示 UWP 的 MediaPlayerElement 媒体播放控件。
完整代码如下
<Window x:Class="WpfApp21.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp21"
xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<xamlhost:WindowsXamlHost
ChildChanged="WindowsXamlHost_ChildChanged"
InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
</Window>
添加 ChildChanged 事件用来处理 MediaPlayerElement 控件创建成功后的要做的事情
- Stretch 设置视频拉伸模式
- Source 设置播放文件路径
- AutoPlay 设置自动播放
- IsMuted 设置静音
- IsLoopingEnabled 设置循环播放
private void WindowsXamlHost_ChildChanged(object sender, EventArgs e)
{
MediaPlayerElement mediaPlayerElement = (MediaPlayerElement)((WindowsXamlHost)sender).Child;
if (mediaPlayerElement != null)
{
mediaPlayerElement.Stretch = Windows.UI.Xaml.Media.Stretch.UniformToFill;
mediaPlayerElement.Source = MediaSource.CreateFromUri(new Uri("C:\wallpapers\comp_LW_L001_C006_PSNK_DENOISE_v02_SDR_PS_FINAL_20180709_FRC_sdr_4k_qp20_240p_t2160_tsa.mov"));
mediaPlayerElement.AutoPlay = true;
mediaPlayerElement.MediaPlayer.IsMuted = true;
mediaPlayerElement.MediaPlayer.IsLoopingEnabled = true;
}
}
编写一个小而强大的 Windows 动态屏保壁纸的更多相关文章
- C# 编写一个简单易用的 Windows 截屏增强工具
半年前我开源了 DreamScene2 一个小而快并且功能强大的 Windows 动态桌面软件.有很多的人喜欢,这使我有了继续做开源的信心.这是我的第二个开源作品 ScreenshotEx 一个简单易 ...
- 一个仿windows泡泡屏保的实现
一个仿windows泡泡屏保的实现 有天看到有人在百度知道上问windows 泡泡屏保该怎么用C#做,一时有趣,就做了一个出来,对于其中几个要点总结如下: 一,屏保程序的制作要求 屏保程序的扩展名是. ...
- C# 基础知识系列- 17 实战篇 编写一个小工具(1)
0. 前言 这是对C# 基础系列的一个总结,现在我们利用之前学到的知识做一个小小的工具来给我们使用. 如果有看过IO篇的小伙伴,应该有印象.当时我提过一个场景描述,我们在平时使用系统的时候,经常会为了 ...
- Pygame:编写一个小游戏 标签: pythonpygame游戏 2017-06-20 15:06 103人阅读 评论(0)
大学最后的考试终于结束了,迎来了暑假和大四的漫长的"自由"假期.当然要自己好好"玩玩"了. 我最近在学习Python,本意是在机器学习深度学习上使用Python ...
- 编写一个小Servlet程序
1.编写一个java类,此类继承HttpServlet 创建完工程(见上一篇随笔:使用eclipse创建在myeclipse中运行的web工程),在src中新建一个包,包名字叫servlet:再新建一 ...
- 【先定一个小目标】在Windows下的安装Elasticsearch
ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...
- 编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现的单词。程序应该找出满足一下条件的单词:该单词的后面紧接着再次出现自己本身。跟踪重复次数最多的单词及其重复次数,输出.
// test13.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 【C语言程序】今天是祖国母亲的生日,特意编写一个小程序,为祖国母亲庆生~
#include <stdio.h> #define N 80 int main(int argc, char *argv[]) { char a[N]; printf("Hel ...
- C# 编写一个小巧快速的 Windows 动态桌面软件
开源自己前段时间使用 C# 编写的 Windows 动态桌面软件,在接下来的博客我将描写一些技术细节和遇到的一些坑.这个软件可以把视频设置成桌面背景播放,不仅如此而且还可以把网页或一个网页文件设置成桌 ...
- 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式
注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...
随机推荐
- Java虚拟机(JVM):第二幕:自动内存管理 - Java内存区域与内存溢出异常
前言:Java与C++之间有一堵高墙,主要是有内存动态分配和垃圾收集技术组成的.墙外的人想要进来,墙内的人想要出去. 一.运行时数据区域 JVM在执行Java程序时,会将其管理的内存划分为若干个不同的 ...
- 基于Electron27+Vite4+React18搭建桌面端项目|electron多开窗口实践
前段时间有分享一篇electron25+vite4搭建跨桌面端vue3应用实践.今天带来最新捣鼓的electron27+react18创建跨端程序.electron多开窗体(模拟QQ登录窗口切换主窗口 ...
- Gitlab仓库代码更新时Jenkins自动构建
环境说明 1.Jenkins和gitlab已经都已经安装完毕 2.Jenkins能连接到gitlab获取项目并能手动创建项目 3.Jenkins和gitlab能相互访问的到(gitlab要能连接到Je ...
- tailwindcss 选型,以及vue配置使用
一.为什么选择tailwindcss? Tailwind CSS 是一个受欢迎的.功能丰富的CSS框架,它与传统的CSS框架(如Bootstrap)有些不同.以下是一些人们通常对于Tailwind C ...
- 前端脚手架CLI生成模版命令工具(包括,npm包的发布,脚手架的搭建,注意事项,优化等)
写在前面 这是停更以后,续更的一篇文章. 为什么好长时间都没有更新,因为去其他平台更新了,包括掘金,思否,简书等. 在那些地方感觉没有归属感,有的平台原创审核很麻烦,简书号称可以获得打赏,可是码了几十 ...
- JSON文件解析工具类(java)
JSON文本转JSONObject对象 当我们给前端返回样式的时候,需要处理json格式的前端样式,往往只需要改变局部数据.但是每次操作都要构造一个JSON对象,如果层级比较多的话,写法较为复杂,也不 ...
- 批处理(Batch或离线计算)和流计算(Streaming或实时计算)
大数据处理流程 课程:https://developer.aliyun.com/learning/course/432/detail/5385 流程 发 批处理(Batch或离线计算) 基础:goog ...
- Acwing 180. 排书
给定 \(n\) 本书,编号为 1∼n. 在初始状态下,书是任意排列的. 在每一次操作中,可以抽取其中连续的一段,再把这段插入到其他某个位置. 我们的目标状态是把书按照 1∼n 的顺序依次排列. 求最 ...
- 【python】【报错:pip中第三库下载成功,但是pycharm却没有显示】一步解决
解决方案: 直接在这个目录下安装第三方库
- Cannot resolve symbol ‘c:forEach‘;Cannot resolve taglib with uri http://java.sun.com/jsp/jstl/corede
#### Cannot resolve taglib with uri http://java.sun.com/jsp/jstl/core:等类似,都是因为 在jsp页面中加入<%@ tagli ...