ToB企服应用市场:ToB评测及商务社交产业平台
标题:
WPF 制作 Windows 屏保
[打印本页]
作者:
络腮胡菲菲
时间:
2022-9-1 20:13
标题:
WPF 制作 Windows 屏保
分享如何使用
WPF 制作 Windows 屏保
WPF 制作 Windows 屏保
作者:驚鏵
原文链接:https://github.com/yanjinhuagood/ScreenSaver
框架使用.NET452;
Visual Studio 2019;
项目使用
MIT
开源许可协议;
更多效果可以通过GitHub[1]|码云[2]下载代码;
也可以自行添加天气信息等。
正文
屏保程序的本质上就是一个 Win32 窗口应用程序;
把编译好一个窗口应用程序之后,把扩展名更改为 scr,于是你的屏幕保护程序就做好了;
选中修改好的 scr 程序上点击右键,可以看到一个 安装 选项,点击之后就安装了;
安装之后会立即看到我们的屏幕保护程序已经运行起来了;
处理屏幕保护程序参数如下
/s
屏幕保护程序开始,或者用户点击了 预览 按钮;
/c
用户点击了 设置按钮;
/p
用户选中屏保程序之后,在预览窗格中显示;
1)MainWindow.xaml 代码如下;
<Window x:Class="ScreenSaver.MainWindow"<br> xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"<br> xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"<br> xmlns:d="http://schemas.microsoft.com/expression/blend/2008"<br> xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"<br> xmlns:system="clr-namespace:System;assembly=mscorlib"<br> xmlns:drawing="http://www.microsoft.net/drawing"<br> xmlns:local="clr-namespace:ScreenSaver"<br> mc:Ignorable="d" WindowStyle="None"<br> Title="MainWindow" Height="450" Width="800"><br> <Grid x:Name="MainGrid"><br> <drawing:PanningItems ItemsSource="{Binding stringCollection,RelativeSource={RelativeSource AncestorType=local:MainWindow}}"<br> x:Name="MyPanningItems"><br> <drawing:PanningItems.ItemTemplate><br> <DataTemplate><br> <Rectangle><br> <Rectangle.Fill><br> <ImageBrush ImageSource="{Binding .}"/><br> </Rectangle.Fill><br> </Rectangle><br> </DataTemplate><br> </drawing:PanningItems.ItemTemplate><br> </drawing:PanningItems><br> <Grid HorizontalAlignment="Center" <br> VerticalAlignment="Top"<br> Margin="0,50,0,0"><br> <Grid.RowDefinitions><br> <RowDefinition/><br> <RowDefinition/><br> </Grid.RowDefinitions><br> <Grid.Resources><br> <br> </Grid.Resources><br> <WrapPanel><br> <TextBlock Text="{Binding Hour,RelativeSource={RelativeSource AncestorType=local:MainWindow}}"/><br> <TextBlock Text=":" x:Name="PART_TextBlock"><br> <TextBlock.Triggers><br> <EventTrigger RoutedEvent="FrameworkElement.Loaded"><br> <BeginStoryboard><br> <Storyboard><br> <DoubleAnimation Duration="00:00:01"<br> From="1"<br> To="0"<br> Storyboard.TargetName="PART_TextBlock"<br> Storyboard.TargetProperty="Opacity"<br> RepeatBehavior="Forever"<br> FillBehavior="Stop"/><br> </Storyboard><br> </BeginStoryboard><br> </EventTrigger><br> </TextBlock.Triggers><br> </TextBlock><br> <TextBlock Text="{Binding Minute,RelativeSource={RelativeSource AncestorType=local:MainWindow}}"/><br> </WrapPanel><br> <TextBlock Grid.Row="1" FontSize="45" HorizontalAlignment="Center" Text="{Binding Date,RelativeSource={RelativeSource AncestorType=local:MainWindow}}"/><br> </Grid><br> </Grid><br></Window><br>
复制代码
2) MainWindow.xaml.cs 代码如下;
当屏保启动后需要注意如下
将鼠标设置为不可见Cursors.None;
将窗体设置为最大化WindowState.Maximized;
WindowStyle设置为"None";
注意监听鼠标按下和键盘按键则退出屏保;
using System;<br>using System.Collections.ObjectModel;<br>using System.Globalization;<br>using System.IO;<br>using System.Windows;<br>using System.Windows.Input;<br>using System.Windows.Threading;<br><br>namespace ScreenSaver<br>{<br> /// <summary><br> /// MainWindow.xaml 的交互逻辑<br> /// </summary><br> public partial class MainWindow : Window<br> {<br> public static readonly DependencyProperty stringCollectionProperty =<br> DependencyProperty.Register("stringCollection", typeof(ObservableCollection<string>), typeof(MainWindow),<br> new PropertyMetadata(null));<br><br> public static readonly DependencyProperty HourProperty =<br> DependencyProperty.Register("Hour", typeof(string), typeof(MainWindow), new PropertyMetadata(null));<br><br> public static readonly DependencyProperty MinuteProperty =<br> DependencyProperty.Register("Minute", typeof(string), typeof(MainWindow), new PropertyMetadata(null));<br><br> public static readonly DependencyProperty SecondProperty =<br> DependencyProperty.Register("Second", typeof(string), typeof(MainWindow), new PropertyMetadata(null));<br><br> public static readonly DependencyProperty DateProperty =<br> DependencyProperty.Register("Date", typeof(string), typeof(MainWindow), new PropertyMetadata());<br><br> private readonly DispatcherTimer timer = new DispatcherTimer();<br><br> public MainWindow()<br> {<br> InitializeComponent();<br> Loaded += delegate<br> {<br> WindowState = WindowState.Maximized;<br> Mouse.OverrideCursor = Cursors.None;<br> var date = DateTime.Now;<br> Hour = date.ToString("HH");<br> Minute = date.ToString("mm");<br> Date =<br> $"{date.Month} / {date.Day} {CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(date.DayOfWeek)}";<br> stringCollection = new ObservableCollection<string>();<br> var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Images");<br> var directoryInfo = new DirectoryInfo(path);<br> foreach (var item in directoryInfo.GetFiles())<br> {<br> if (Path.GetExtension(item.Name) != ".jpg") continue;<br> stringCollection.Add(item.FullName);<br> }<br><br> timer.Interval = TimeSpan.FromSeconds(1);<br> timer.Tick += delegate<br> {<br> date = DateTime.Now;<br> Hour = date.ToString("HH");<br> Minute = date.ToString("mm");<br> Date =<br> $"{date.Month} / {date.Day} {CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(date.DayOfWeek)}";<br> };<br> timer.Start();<br> };<br> MouseDown += delegate { Application.Current.Shutdown(); };<br> KeyDown += delegate { Application.Current.Shutdown(); };<br> }<br><br> public ObservableCollection<string> stringCollection<br> {<br> get => (ObservableCollection<string>)GetValue(stringCollectionProperty);<br> set => SetValue(stringCollectionProperty, value);<br> }<br><br><br> public string Hour<br> {<br> get => (string)GetValue(HourProperty);<br> set => SetValue(HourProperty, value);<br> }<br><br> public string Minute<br> {<br> get => (string)GetValue(MinuteProperty);<br> set => SetValue(MinuteProperty, value);<br> }<br><br> public string Second<br> {<br> get => (string)GetValue(SecondProperty);<br> set => SetValue(SecondProperty, value);<br> }<br><br><br> public string Date<br> {<br> get => (string)GetValue(DateProperty);<br> set => SetValue(DateProperty, value);<br> }<br> }<br>}<br>
复制代码
参考①[3]参考②[4]
参考资料
[1] GitHub:
https://github.com/yanjinhuagood/ScreenSaver
[2] 码云:
https://gitee.com/yanjinhua/ScreenSaver
[3] 参考①:
https://blog.walterlv.com/post/write-a-windows-screen-saver-using-wpf.html
[4] 参考②:
https://wbsimms.com/create-screensaver-net-wpf/
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4