利用WPF實(shí)現(xiàn)Windows屏保的制作
介紹
框架使用.NET452;
Visual Studio 2019;
項(xiàng)目使用 MIT 開(kāi)源許可協(xié)議;
更多效果可以通過(guò)GitHub[1]|碼云[2]下載代碼;
也可以自行添加天氣信息等。
正文
屏保程序的本質(zhì)上就是一個(gè)Win32 窗口應(yīng)用程序;
把編譯好一個(gè)窗口應(yīng)用程序之后,把擴(kuò)展名更改為 scr,于是你的屏幕保護(hù)程序就做好了;

選中修改好的 scr 程序上點(diǎn)擊右鍵,可以看到一個(gè) 安裝 選項(xiàng),點(diǎn)擊之后就安裝了;

安裝之后會(huì)立即看到我們的屏幕保護(hù)程序已經(jīng)運(yùn)行起來(lái)了;

處理屏幕保護(hù)程序參數(shù)如下
/s 屏幕保護(hù)程序開(kāi)始,或者用戶點(diǎn)擊了 預(yù)覽 按鈕;
/c 用戶點(diǎn)擊了 設(shè)置按鈕;
/p 用戶選中屏保程序之后,在預(yù)覽窗格中顯示;

實(shí)現(xiàn)代碼
1)MainWindow.xaml 代碼如下;
<Window?x:Class="ScreenSaver.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:system="clr-namespace:System;assembly=mscorlib"
????????xmlns:drawing="http://www.microsoft.net/drawing"
????????xmlns:local="clr-namespace:ScreenSaver"
????????mc:Ignorable="d"?WindowStyle="None"
????????Title="MainWindow"?Height="450"?Width="800">
????<Grid?x:Name="MainGrid">
????????<drawing:PanningItems?ItemsSource="{Binding?stringCollection,RelativeSource={RelativeSource?AncestorType=local:MainWindow}}"
??????????????????????????????x:Name="MyPanningItems">
????????????<drawing:PanningItems.ItemTemplate>
????????????????<DataTemplate>
????????????????????<Rectangle>
????????????????????????<Rectangle.Fill>
????????????????????????????<ImageBrush?ImageSource="{Binding?.}"/>
????????????????????????</Rectangle.Fill>
????????????????????</Rectangle>
????????????????</DataTemplate>
????????????</drawing:PanningItems.ItemTemplate>
????????</drawing:PanningItems>
????????<Grid??HorizontalAlignment="Center"?
???????????????VerticalAlignment="Top"
????????????????Margin="0,50,0,0">
????????????<Grid.RowDefinitions>
????????????????<RowDefinition/>
????????????????<RowDefinition/>
????????????</Grid.RowDefinitions>
????????????<Grid.Resources>
????????????????<Style?TargetType="TextBlock">
????????????????????<Setter?Property="FontSize"?Value="90"/>
????????????????????<Setter?Property="FontWeight"?Value="Black"/>
????????????????????<Setter?Property="Foreground"?Value="White"/>
????????????????</Style>
????????????</Grid.Resources>
????????????<WrapPanel>
????????????????<TextBlock?Text="{Binding?Hour,RelativeSource={RelativeSource?AncestorType=local:MainWindow}}"/>
????????????????<TextBlock?Text=":"?x:Name="PART_TextBlock">
????????????????????<TextBlock.Triggers>
????????????????????????<EventTrigger?RoutedEvent="FrameworkElement.Loaded">
????????????????????????????<BeginStoryboard>
????????????????????????????????<Storyboard>
????????????????????????????????????<DoubleAnimation?Duration="00:00:01"
?????????????????????????????????????????????????From="1"
?????????????????????????????????????????????????To="0"
?????????????????????????????????????????????????Storyboard.TargetName="PART_TextBlock"
?????????????????????????????????????????????????Storyboard.TargetProperty="Opacity"
?????????????????????????????????????????????????RepeatBehavior="Forever"
?????????????????????????????????????????????????FillBehavior="Stop"/>
????????????????????????????????</Storyboard>
????????????????????????????</BeginStoryboard>
????????????????????????</EventTrigger>
????????????????????</TextBlock.Triggers>
????????????????</TextBlock>
????????????????<TextBlock?Text="{Binding?Minute,RelativeSource={RelativeSource?AncestorType=local:MainWindow}}"/>
????????????</WrapPanel>
????????????<TextBlock?Grid.Row="1"?FontSize="45"?HorizontalAlignment="Center"?Text="{Binding?Date,RelativeSource={RelativeSource?AncestorType=local:MainWindow}}"/>
????????</Grid>
????</Grid>
</Window>
2) MainWindow.xaml.cs 代碼如下;
當(dāng)屏保啟動(dòng)后需要注意如下
- 將鼠標(biāo)設(shè)置為不可見(jiàn)
Cursors.None; - 將窗體設(shè)置為最大化
WindowState.Maximized; WindowStyle設(shè)置為"None";- 注意監(jiān)聽(tīng)鼠標(biāo)按下和鍵盤(pán)按鍵則退出屏保;
using?System;
using?System.Collections.ObjectModel;
using?System.Globalization;
using?System.IO;
using?System.Windows;
using?System.Windows.Input;
using?System.Windows.Threading;
namespace?ScreenSaver
{
????///?<summary>
????///?????MainWindow.xaml?的交互邏輯
????///?</summary>
????public?partial?class?MainWindow?:?Window
????{
????????public?static?readonly?DependencyProperty?stringCollectionProperty?=
????????????DependencyProperty.Register("stringCollection",?typeof(ObservableCollection<string>),?typeof(MainWindow),
????????????????new?PropertyMetadata(null));
????????public?static?readonly?DependencyProperty?HourProperty?=
????????????DependencyProperty.Register("Hour",?typeof(string),?typeof(MainWindow),?new?PropertyMetadata(null));
????????public?static?readonly?DependencyProperty?MinuteProperty?=
????????????DependencyProperty.Register("Minute",?typeof(string),?typeof(MainWindow),?new?PropertyMetadata(null));
????????public?static?readonly?DependencyProperty?SecondProperty?=
????????????DependencyProperty.Register("Second",?typeof(string),?typeof(MainWindow),?new?PropertyMetadata(null));
????????public?static?readonly?DependencyProperty?DateProperty?=
????????????DependencyProperty.Register("Date",?typeof(string),?typeof(MainWindow),?new?PropertyMetadata());
????????private?readonly?DispatcherTimer?timer?=?new?DispatcherTimer();
????????public?MainWindow()
????????{
????????????InitializeComponent();
????????????Loaded?+=?delegate
????????????{
????????????????WindowState?=?WindowState.Maximized;
????????????????Mouse.OverrideCursor?=?Cursors.None;
????????????????var?date?=?DateTime.Now;
????????????????Hour?=?date.ToString("HH");
????????????????Minute?=?date.ToString("mm");
????????????????Date?=
????????????????????$"{date.Month}?/?{date.Day}???{CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(date.DayOfWeek)}";
????????????????stringCollection?=?new?ObservableCollection<string>();
????????????????var?path?=?Path.Combine(AppDomain.CurrentDomain.BaseDirectory,?"Images");
????????????????var?directoryInfo?=?new?DirectoryInfo(path);
????????????????foreach?(var?item?in?directoryInfo.GetFiles())
????????????????{
????????????????????if?(Path.GetExtension(item.Name)?!=?".jpg")?continue;
????????????????????stringCollection.Add(item.FullName);
????????????????}
????????????????timer.Interval?=?TimeSpan.FromSeconds(1);
????????????????timer.Tick?+=?delegate
????????????????{
????????????????????date?=?DateTime.Now;
????????????????????Hour?=?date.ToString("HH");
????????????????????Minute?=?date.ToString("mm");
????????????????????Date?=
????????????????????????$"{date.Month}?/?{date.Day}???{CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(date.DayOfWeek)}";
????????????????};
????????????????timer.Start();
????????????};
????????????MouseDown?+=?delegate?{?Application.Current.Shutdown();?};
????????????KeyDown?+=?delegate?{?Application.Current.Shutdown();?};
????????}
????????public?ObservableCollection<string>?stringCollection
????????{
????????????get?=>?(ObservableCollection<string>)GetValue(stringCollectionProperty);
????????????set?=>?SetValue(stringCollectionProperty,?value);
????????}
????????public?string?Hour
????????{
????????????get?=>?(string)GetValue(HourProperty);
????????????set?=>?SetValue(HourProperty,?value);
????????}
????????public?string?Minute
????????{
????????????get?=>?(string)GetValue(MinuteProperty);
????????????set?=>?SetValue(MinuteProperty,?value);
????????}
????????public?string?Second
????????{
????????????get?=>?(string)GetValue(SecondProperty);
????????????set?=>?SetValue(SecondProperty,?value);
????????}
????????public?string?Date
????????{
????????????get?=>?(string)GetValue(DateProperty);
????????????set?=>?SetValue(DateProperty,?value);
????????}
????}
}到此這篇關(guān)于利用WPF實(shí)現(xiàn)Windows屏保的制作的文章就介紹到這了,更多相關(guān)WPF制作Windows屏保內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中static void Main(string[] args) 參數(shù)示例詳解
這篇文章主要介紹了C#中static void Main(string[] args) 參數(shù)詳解,本文通過(guò)具體示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-03-03
C#結(jié)合JavaScript對(duì)Web控件進(jìn)行數(shù)據(jù)輸入驗(yàn)證的實(shí)現(xiàn)方法
在 Web 應(yīng)用的錄入界面,數(shù)據(jù)驗(yàn)證是一項(xiàng)重要的實(shí)現(xiàn)功能,數(shù)據(jù)驗(yàn)證是指確認(rèn) Web 控件輸入或選擇的數(shù)據(jù),本文我們將介紹如何通過(guò)C# 后端及JavaScript 前端對(duì) Web 控件進(jìn)行數(shù)據(jù)輸入有效性的驗(yàn)證,感興趣的朋友可以參考一下2024-05-05
c# AcceptEx與完成端口(IOCP)結(jié)合的示例
這篇文章主要介紹了c# AcceptEx與完成端口(IOCP)結(jié)合的示例,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03
C#中Abstract 、Virtual和Override的使用及區(qū)別
C#中virtual,abstract,override用于方法重載,子類覆蓋了父類的相同方法,父類中的實(shí)現(xiàn)不可能再被外面調(diào)用。本文給大家重點(diǎn)介紹C#中Abstract 、Virtual和Override的使用及區(qū)別,需要的朋友參考下吧2021-06-06
C#使用QRCode生成海報(bào)圖并嵌入定位帶logo的二維碼
這篇文章主要為大家詳細(xì)介紹了C#如何使用QRCode生成海報(bào)圖并嵌入定位帶logo的二維碼,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考下2024-03-03
C# 實(shí)現(xiàn)TXT文檔轉(zhuǎn)Table的示例代碼
這篇文章主要介紹了C# 實(shí)現(xiàn)TXT文檔轉(zhuǎn)Table的示例代碼,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下2020-12-12

