翼度科技»论坛 编程开发 .net 查看内容

编写一个小而强大的 Windows 动态屏保壁纸

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
写在前面

两年前我做了第一个开源软件 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 媒体播放控件。
完整代码如下
  1. <Window x:
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6.         xmlns:local="clr-namespace:WpfApp21"
  7.         xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
  8.         mc:Ignorable="d"
  9.         Title="MainWindow" Height="450" Width="800">
  10.     <xamlhost:WindowsXamlHost
  11.         ChildChanged="WindowsXamlHost_ChildChanged"
  12.         InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
  13. </Window>
复制代码
添加 ChildChanged 事件用来处理 MediaPlayerElement 控件创建成功后的要做的事情

  • Stretch 设置视频拉伸模式
  • Source 设置播放文件路径
  • AutoPlay 设置自动播放
  • IsMuted 设置静音
  • IsLoopingEnabled 设置循环播放
  1. private void WindowsXamlHost_ChildChanged(object sender, EventArgs e){<Window x:
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6.         xmlns:local="clr-namespace:WpfApp21"
  7.         xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
  8.         mc:Ignorable="d"
  9.         Title="MainWindow" Height="450" Width="800">
  10.     <xamlhost:WindowsXamlHost
  11.         ChildChanged="WindowsXamlHost_ChildChanged"
  12.         InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
  13. </Window>MediaPlayerElement mediaPlayerElement = (MediaPlayerElement)((WindowsXamlHost)sender).Child;<Window x:
  14.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  15.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  16.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  17.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  18.         xmlns:local="clr-namespace:WpfApp21"
  19.         xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
  20.         mc:Ignorable="d"
  21.         Title="MainWindow" Height="450" Width="800">
  22.     <xamlhost:WindowsXamlHost
  23.         ChildChanged="WindowsXamlHost_ChildChanged"
  24.         InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
  25. </Window>if (mediaPlayerElement != null)<Window x:
  26.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  27.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  28.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  29.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  30.         xmlns:local="clr-namespace:WpfApp21"
  31.         xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
  32.         mc:Ignorable="d"
  33.         Title="MainWindow" Height="450" Width="800">
  34.     <xamlhost:WindowsXamlHost
  35.         ChildChanged="WindowsXamlHost_ChildChanged"
  36.         InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
  37. </Window>{<Window x:
  38.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  39.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  40.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  41.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  42.         xmlns:local="clr-namespace:WpfApp21"
  43.         xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
  44.         mc:Ignorable="d"
  45.         Title="MainWindow" Height="450" Width="800">
  46.     <xamlhost:WindowsXamlHost
  47.         ChildChanged="WindowsXamlHost_ChildChanged"
  48.         InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
  49. </Window><Window x:
  50.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  51.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  52.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  53.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  54.         xmlns:local="clr-namespace:WpfApp21"
  55.         xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
  56.         mc:Ignorable="d"
  57.         Title="MainWindow" Height="450" Width="800">
  58.     <xamlhost:WindowsXamlHost
  59.         ChildChanged="WindowsXamlHost_ChildChanged"
  60.         InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
  61. </Window>mediaPlayerElement.Stretch = Windows.UI.Xaml.Media.Stretch.UniformToFill;<Window x:
  62.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  63.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  64.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  65.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  66.         xmlns:local="clr-namespace:WpfApp21"
  67.         xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
  68.         mc:Ignorable="d"
  69.         Title="MainWindow" Height="450" Width="800">
  70.     <xamlhost:WindowsXamlHost
  71.         ChildChanged="WindowsXamlHost_ChildChanged"
  72.         InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
  73. </Window><Window x:
  74.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  75.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  76.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  77.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  78.         xmlns:local="clr-namespace:WpfApp21"
  79.         xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
  80.         mc:Ignorable="d"
  81.         Title="MainWindow" Height="450" Width="800">
  82.     <xamlhost:WindowsXamlHost
  83.         ChildChanged="WindowsXamlHost_ChildChanged"
  84.         InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
  85. </Window>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"));<Window x:
  86.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  87.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  88.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  89.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  90.         xmlns:local="clr-namespace:WpfApp21"
  91.         xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
  92.         mc:Ignorable="d"
  93.         Title="MainWindow" Height="450" Width="800">
  94.     <xamlhost:WindowsXamlHost
  95.         ChildChanged="WindowsXamlHost_ChildChanged"
  96.         InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
  97. </Window><Window x:
  98.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  99.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  100.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  101.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  102.         xmlns:local="clr-namespace:WpfApp21"
  103.         xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
  104.         mc:Ignorable="d"
  105.         Title="MainWindow" Height="450" Width="800">
  106.     <xamlhost:WindowsXamlHost
  107.         ChildChanged="WindowsXamlHost_ChildChanged"
  108.         InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
  109. </Window>mediaPlayerElement.AutoPlay = true;<Window x:
  110.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  111.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  112.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  113.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  114.         xmlns:local="clr-namespace:WpfApp21"
  115.         xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
  116.         mc:Ignorable="d"
  117.         Title="MainWindow" Height="450" Width="800">
  118.     <xamlhost:WindowsXamlHost
  119.         ChildChanged="WindowsXamlHost_ChildChanged"
  120.         InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
  121. </Window><Window x:
  122.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  123.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  124.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  125.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  126.         xmlns:local="clr-namespace:WpfApp21"
  127.         xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
  128.         mc:Ignorable="d"
  129.         Title="MainWindow" Height="450" Width="800">
  130.     <xamlhost:WindowsXamlHost
  131.         ChildChanged="WindowsXamlHost_ChildChanged"
  132.         InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
  133. </Window>mediaPlayerElement.MediaPlayer.IsMuted = true;<Window x:
  134.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  135.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  136.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  137.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  138.         xmlns:local="clr-namespace:WpfApp21"
  139.         xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
  140.         mc:Ignorable="d"
  141.         Title="MainWindow" Height="450" Width="800">
  142.     <xamlhost:WindowsXamlHost
  143.         ChildChanged="WindowsXamlHost_ChildChanged"
  144.         InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
  145. </Window><Window x:
  146.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  147.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  148.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  149.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  150.         xmlns:local="clr-namespace:WpfApp21"
  151.         xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
  152.         mc:Ignorable="d"
  153.         Title="MainWindow" Height="450" Width="800">
  154.     <xamlhost:WindowsXamlHost
  155.         ChildChanged="WindowsXamlHost_ChildChanged"
  156.         InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
  157. </Window>mediaPlayerElement.MediaPlayer.IsLoopingEnabled = true;<Window x:
  158.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  159.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  160.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  161.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  162.         xmlns:local="clr-namespace:WpfApp21"
  163.         xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"
  164.         mc:Ignorable="d"
  165.         Title="MainWindow" Height="450" Width="800">
  166.     <xamlhost:WindowsXamlHost
  167.         ChildChanged="WindowsXamlHost_ChildChanged"
  168.         InitialTypeName="Windows.UI.Xaml.Controls.MediaPlayerElement" />
  169. </Window>}}
复制代码
来源:https://www.cnblogs.com/he55/Undeclared/17959763
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具