写在前面

两年前我做了第一个开源软件 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 动态屏保壁纸的更多相关文章

  1. C# 编写一个简单易用的 Windows 截屏增强工具

    半年前我开源了 DreamScene2 一个小而快并且功能强大的 Windows 动态桌面软件.有很多的人喜欢,这使我有了继续做开源的信心.这是我的第二个开源作品 ScreenshotEx 一个简单易 ...

  2. 一个仿windows泡泡屏保的实现

    一个仿windows泡泡屏保的实现 有天看到有人在百度知道上问windows 泡泡屏保该怎么用C#做,一时有趣,就做了一个出来,对于其中几个要点总结如下: 一,屏保程序的制作要求 屏保程序的扩展名是. ...

  3. C# 基础知识系列- 17 实战篇 编写一个小工具(1)

    0. 前言 这是对C# 基础系列的一个总结,现在我们利用之前学到的知识做一个小小的工具来给我们使用. 如果有看过IO篇的小伙伴,应该有印象.当时我提过一个场景描述,我们在平时使用系统的时候,经常会为了 ...

  4. Pygame:编写一个小游戏 标签: pythonpygame游戏 2017-06-20 15:06 103人阅读 评论(0)

    大学最后的考试终于结束了,迎来了暑假和大四的漫长的"自由"假期.当然要自己好好"玩玩"了. 我最近在学习Python,本意是在机器学习深度学习上使用Python ...

  5. 编写一个小Servlet程序

    1.编写一个java类,此类继承HttpServlet 创建完工程(见上一篇随笔:使用eclipse创建在myeclipse中运行的web工程),在src中新建一个包,包名字叫servlet:再新建一 ...

  6. 【先定一个小目标】在Windows下的安装Elasticsearch

    ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...

  7. 编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现的单词。程序应该找出满足一下条件的单词:该单词的后面紧接着再次出现自己本身。跟踪重复次数最多的单词及其重复次数,输出.

    // test13.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  8. 【C语言程序】今天是祖国母亲的生日,特意编写一个小程序,为祖国母亲庆生~

    #include <stdio.h> #define N 80 int main(int argc, char *argv[]) { char a[N]; printf("Hel ...

  9. C# 编写一个小巧快速的 Windows 动态桌面软件

    开源自己前段时间使用 C# 编写的 Windows 动态桌面软件,在接下来的博客我将描写一些技术细节和遇到的一些坑.这个软件可以把视频设置成桌面背景播放,不仅如此而且还可以把网页或一个网页文件设置成桌 ...

  10. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

随机推荐

  1. 我为什么要从PhoneGap中逃离? 转

    我为什么要从PhoneGap中逃离?  摘要:每一位程序员都有自己的技术信仰,我也不例外.但当技术信仰遇到实际工作中的问题时,你又要怎么做呢?还记得刚刚接触HTML5做跨平台开发的时候这样的问题就摆在 ...

  2. Kbaor_2023_9_28_Java第一次实战项目_ELM_V1_食品的实体类、工具类与实现类

    Kbaor_2023_9_28_Java第一次实战项目_ELM_V1_食品的实体类.工具类与实现类 ELM_V1_食品的实体类 package elm_V1; /** * [食品实体类] * * @a ...

  3. java算法之排序算法大全

    ①排序 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法.排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方 ...

  4. OA、CRM、SCM、ERP之间的区别和联系是什么?

    当然,各个系统之间要集成.集成之后的东西,不叫做ERP.做ERP的人说叫ERP,做PLM的人说叫PLM,卖OA的人更愿意叫OA.其实,那个集成之后的东西,啥也不叫.   英文名 中文名 百科释义 关注 ...

  5. IDEA配置maven引入包时报Unable to import maven project: See logs for details 错误的解决办法

    这也是我遇到的问题,在此记录下一,当时百度了一下午试过了各种方法,最后看到了一位大佬的博客解决了这个问题. 所以我也抄一下大佬博客也是记录一下问题的解决过程,以免下次遇到相似问题再浪费不必要的时间 参 ...

  6. 前端技术探秘-Nodejs的CommonJS规范实现原理

    了解Node.js Node.js是一个基于ChromeV8引擎的JavaScript运行环境,使用了一个事件驱动.非阻塞式I/O模型,让JavaScript 运行在服务端的开发平台,它让JavaSc ...

  7. Android 输入系统介绍

    目录 一.目的 二.环境 三.相关概念 3.1 输入设备 3.2 UEVENT机制 3.3 JNI 3.4 EPOLL机制 3.5 INotify 四.详细设计 4.1 结构图 4.2 代码结构 4. ...

  8. SpringCore完整学习教程4,入门级别

    本章从第4章开始 4. Logging Spring Boot使用Commons Logging进行所有内部日志记录,但保留底层日志实现开放.为Java Util Logging.Log4J2和Log ...

  9. [ABC263A] Full House

    Problem Statement We have five cards with integers $A$, $B$, $C$, $D$, and $E$ written on them, one ...

  10. FolkMQ 内存型消息中间件,v1.0.21 发布

    简介 采用 "多路复用" + "内存运行" + "快照持久化" + "Broker 集群模式"(可选)+ 基于 Sock ...