.net 写一段屏保程序,读取电脑中的图片或者视频进行循环播放
以下是一个基于 .NET 6 WPF 实现的简单屏保程序示例,支持循环播放指定文件夹中的图片和视频。程序会全屏运行,并自动检测用户输入(移动鼠标或按键)退出。
步骤 1:创建 WPF 项目
使用 Visual Studio 创建 WPF 应用程序,命名为 MediaScreensaver。
添加必要的 NuGet 包:
bash
Copy Code
Install-Package Microsoft.Windows.SDK.Contracts -Version 10.0.22000.196
步骤 2:编写代码
MainWindow.xaml
xml
Copy Code
<!-- 视频播放控件 -->
<MediaElement x:Name="VideoDisplay" LoadedBehavior="Manual" UnloadedBehavior="Stop"
MediaEnded="VideoDisplay_MediaEnded" Visibility="Collapsed"/>
</Grid>
MainWindow.xaml.cs
csharp
Copy Code
using System;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;
namespace MediaScreensaver
{
public partial class MainWindow : Window
{
private string[] _mediaFiles; // 支持的媒体文件路径
private int _currentIndex = 0; // 当前播放索引
private DispatcherTimer _timer; // 切换计时器
public MainWindow()
{
InitializeComponent();
Loaded += MainWindow_Loaded;
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
// 隐藏光标
Cursor = Cursors.None;
// 查找媒体文件(示例路径,可自定义)
string mediaFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
_mediaFiles = Directory.GetFiles(mediaFolder, "*.*", SearchOption.AllDirectories)
.Where(f => IsSupportedMedia(f))
.ToArray();
if (_mediaFiles.Length == 0)
{
MessageBox.Show("未找到支持的媒体文件!");
Close();
return;
}
// 初始化计时器(每隔10秒切换)
_timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(10) };
_timer.Tick += Timer_Tick;
_timer.Start();
// 播放第一个文件
PlayMedia(_currentIndex);
}
// 判断是否为支持的媒体格式
private bool IsSupportedMedia(string filePath)
{
string ext = Path.GetExtension(filePath).ToLower();
return new[] { ".jpg", ".jpeg", ".png", ".bmp", ".mp4", ".wmv", ".avi" }.Contains(ext);
}
// 播放媒体
private void PlayMedia(int index)
{
if (index < 0 || index >= _mediaFiles.Length) return;
string file = _mediaFiles[index];
string ext = Path.GetExtension(file).ToLower();
// 根据文件类型切换控件
if (ext is ".mp4" or ".wmv" or ".avi")
{
VideoDisplay.Visibility = Visibility.Visible;
ImageDisplay.Visibility = Visibility.Collapsed;
VideoDisplay.Source = new Uri(file);
VideoDisplay.Play();
}
else
{
VideoDisplay.Visibility = Visibility.Collapsed;
ImageDisplay.Visibility = Visibility.Visible;
ImageDisplay.Source = new System.Windows.Media.Imaging.BitmapImage(new Uri(file));
}
}
// 计时器切换下一个文件
private void Timer_Tick(object sender, EventArgs e)
{
_currentIndex = (_currentIndex + 1) % _mediaFiles.Length;
PlayMedia(_currentIndex);
}
// 视频播放完成后自动切换
private void VideoDisplay_MediaEnded(object sender, RoutedEventArgs e)
{
_timer.Stop();
_currentIndex = (_currentIndex + 1) % _mediaFiles.Length;
PlayMedia(_currentIndex);
_timer.Start();
}
// 用户输入时退出屏保
protected override void OnMouseMove(MouseEventArgs e)
{
Close();
}
protected override void OnKeyDown(KeyEventArgs e)
{
Close();
}
}
}
App.xaml.cs(处理命令行参数)
csharp
Copy Code
using System.Windows;
namespace MediaScreensaver
{
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
// 处理屏保启动参数
if (e.Args.Length > 0)
{
string arg = e.Args.ToLower();
switch (arg)
{
case "/s": // 启动屏保
new MainWindow().Show();
break;
case "/c": // 配置(示例)
MessageBox.Show("配置功能未实现");
Current.Shutdown();
break;
default:
Current.Shutdown();
break;
}
}
else
{
Current.Shutdown();
}
}
}
}
步骤 3:编译为屏保程序
在项目属性中设置输出类型为 Windows 应用程序。
编译生成 MediaScreensaver.exe。
将文件重命名为 MediaScreensaver.scr。
步骤 4:安装屏保程序
复制 MediaScreensaver.scr 到系统屏保目录:
powershell
Copy Code
Copy-Item .\MediaScreensaver.scr "$env:windir\System32"
打开 屏幕保护设置:
选择 MediaScreensaver。
设置等待时间。
功能特性
全屏播放:自动最大化,隐藏窗口边框和光标。
格式支持:图片(JPG/PNG/BMP)和视频(MP4/WMV/AVI)。
自动切换:默认每10秒切换媒体,视频播放完成后立即切换。
用户退出:移动鼠标或按键关闭屏保。
扩展建议
自定义文件夹:
添加配置文件(如 settings.json)让用户指定媒体路径。
随机播放:
在 _mediaFiles 加载后使用 Random.Shuffle 打乱顺序。
多显示器支持:
使用 System.Windows.Forms.Screen.AllScreens 在每个显示器上创建窗口。
过渡动画:
在图片切换时添加淡入淡出效果。
注意事项
视频解码:确保系统已安装必要的编解码器(如 K-Lite Codec Pack)。
性能优化:避免加载过大的视频文件导致内存溢出。
安全提示:屏保程序需通过数字签名避免被系统拦截。

浙公网安备 33010602011771号