WPF 制作 Windows 屏保

 分享如何使用WPF 制作 Windows 屏保

WPF 制作 Windows 屏保

作者:驚鏵

原文链接:https://github.com/yanjinhuagood/ScreenSaver

  • 框架使用.NET452

  • Visual Studio 2019;

  • 项目使用 MIT 开源许可协议;

  • 更多效果可以通过GitHub[1]|码云[2]下载代码;

  • 也可以自行添加天气信息等。

 正文

  • 屏保程序的本质上就是一个 Win32 窗口应用程序;

    7f08b1a0ad12a2e3d8b7f6e289ca3e36.png
    • 把编译好一个窗口应用程序之后,把扩展名更改为 scr,于是你的屏幕保护程序就做好了;f89f50763cc83b19108dc924ad52325d.png

    • 选中修改好的 scr 程序上点击右键,可以看到一个 安装 选项,点击之后就安装了;d69ac48ac74205fde50bf0ed30c54b08.png

    • 安装之后会立即看到我们的屏幕保护程序已经运行起来了;

  • 处理屏幕保护程序参数如下

    • /s 屏幕保护程序开始,或者用户点击了 预览 按钮;

    • /c 用户点击了 设置按钮;

    • /p 用户选中屏保程序之后,在预览窗格中显示;da4e35c2bec50d85faa43ba7bbb06af5.png

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 代码如下;

  • 当屏保启动后需要注意如下

    • 将鼠标设置为不可见Cursors.None;

    • 将窗体设置为最大化WindowState.Maximized;

    • WindowStyle设置为"None";

    • 注意监听鼠标按下键盘按键则退出屏保;

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);}}
}

参考①[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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows 7 下右键发送到菜单项没了

为什么80%的码农都做不了架构师&#xff1f;>>> 问题描述: 突然有一天,Windows 7 下右键发送到菜单项没了,如图所示: 问题原因 黑人问号脸? 转载于:https://my.oschina.net/taadis/blog/1591398

【ArcGIS微课1000例】0016:ArcGIS书签操作(添加书签、管理书签)知多少?

书签可以将地图数据的某一视图状态保存起来,以便在使用时打开书签,直接回到这一视图状态。可创建多个书签以便快速回到不同的视图状态,也可以对书签进行管理。 文章目录 1 创建书签2 管理书签注意:书签只针对空间数据,在【布局视图】中是不能创建书签的。 1 创建书签 可…

分享一个WPF 实现 Windows 软件快捷小工具

分享一个WPF 实现 Windows 软件快捷小工具Windows 软件快捷小工具作者&#xff1a;WPFDevelopersOrg原文链接&#xff1a;https://github.com/WPFDevelopersOrg/SoftwareHelper框架使用.NET40&#xff1b;Visual Studio 2019;项目使用 MIT 开源许可协议&#xff1b;项目使用 MV…

学习环境配置:Manjaro、MSYS2以及常见软件

0.前言 在说Manjaro之前&#xff0c;要先说一下Linux发行版。对于各大发行版而言&#xff0c;内核只有版本的差异&#xff0c;最重要的区别就是包管理系统。常见的包管理系统包括&#xff1a;Pacman&#xff0c;Apt , Yum和Portage。在学习Linux的过程中&#xff0c;和大数人一…

【ArcGIS微课1000例】0017:ArcGIS测量距离和面积工具的巧妙使用

文章目录 1 交互式测量2 测量要素ArcGIS提供了快速测量距离和面积的工具,通过测量工具可对地图中的线和面进行测量。 工具条: 测量工具位于【工具】工具条上,如下图所示: 测量界面: 功能按钮简介: 可使用此工具在地图上绘制一条线或者一个面,然后获取线的长度与面的面…

[转]HTTP/3 未来可期?

2015 年 HTTP/2 标准发表后&#xff0c;大多数主流浏览器也于当年年底支持该标准。此后&#xff0c;凭借着多路复用、头部压缩、服务器推送等优势&#xff0c;HTTP/2 得到了越来越多开发者的青睐&#xff0c;不知不觉的 HTTP 已经发展到了第三代。本文基于兴趣部落接入 HTTP/3 …

【ArcGIS微课1000例】0018:ArcGIS设置相对路径和数据源

文章目录 ArcGIS设置相对路径ArcGIS设置数据源ArcGIS设置相对路径 菜鸟们在使用ArcGIS时经常会碰到将地图文档(.mxd)拷贝到别的电脑上或改变一个路径时,出现数据丢失的现象,具体表现为图层前面出现一个红色的感叹号,如下图所示。 出现以上问题的根本原因是数据GSS.tif的原…

AI 之 OpenCvSharp 安卓手机摄像头识别人脸

OpenCvSharp是OpenCv的包装器&#xff0c;相当于底层是OpenCv只是用.Net的方式调用底层的接口的实现&#xff0c;所以&#xff0c;从OpenCv的知识架构来讲&#xff0c;源码是一样一样的。就是换个语言写而已。1. OpenCvSharp 尽可能地以原生 OpenCV C/C API 风格为蓝本。2. Ope…

iVX低代码平台系列制作APP简单的个人界面

一、前言 我们知道&#xff0c;目前市场上开发app或者小程序这些应用&#xff0c;都离不开一个个人界面&#xff0c;就是类似下面的这种界面&#xff0c;我们可以利用iVX低代码平台来开发&#xff0c;简单快速&#xff0c;如果还有不知道iVX低代码平台是啥的&#xff0c;猛戳这…

[转]【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

前言 很多小伙伴反馈说&#xff0c;高并发专题学了那么久&#xff0c;但是&#xff0c;在真正做项目时&#xff0c;仍然不知道如何下手处理高并发业务场景&#xff01;甚至很多小伙伴仍然停留在只是简单的提供接口&#xff08;CRUD&#xff09;阶段&#xff0c;不知道学习的并发…

【ArcGIS微课1000例】0019:什么是Shapefile文件?Shapefile文件之全解

文章目录 Shapefile文件组成Shapefile文件创建Shapefile文件大小限制Shapefile文件注意事项ESRI Shapefile(shp),或简称shapefile,是美国环境系统研究所公司(ESRI)开发的一种空间数据开放格式。该文件格式已经成为了地理信息软件界的一个开放标准,这表明ESRI公司在全球的…

扼杀 304,Cache-Control: immutable

随着近些年社交网站的流行&#xff0c;越来越多的人学会了“刷”网页 ── 刷微博&#xff0c;刷朋友圈&#xff0c;刷新闻&#xff0c;刷秒杀页。这里的“刷”&#xff0c;就是刷新的意思&#xff0c;在浏览器里&#xff0c;你可以通过点击刷新按钮&#xff0c;或者用快捷键&a…

Eolink是国产API接口管理的无冕之王

一、传统API接口管理的缺陷 1、前言 项目开发我们都知道在一个项目团队中是由很多角色组成&#xff0c;最常见团队的就是前端开发工程师、客户端开发工程师、服务端开发工程师组成一个团队&#xff0c;团队之间进行合作&#xff0c;一般我们都离不开API接口管理和测试&#x…

【数据结构】二叉排序树

二叉排序树&#xff08;Binary Sort Tree&#xff09;又称二叉查找树&#xff08;Binary Search Tree&#xff09;&#xff0c;亦称二叉搜索树。 特点 二叉排序树或者是一棵空树&#xff0c;或者是具有下列性质的二叉树&#xff1a; 1、若左子树不空&#xff0c;则左子树上所有…

记一次 .NET 某电厂Web系统 内存泄漏分析

一&#xff1a;背景 1. 讲故事前段时间有位朋友找到我&#xff0c;说他的程序内存占用比较大&#xff0c;寻求如何解决&#xff0c;截图就不发了&#xff0c;分析下来我感觉除了程序本身的问题之外&#xff0c;.NET5 在内存管理方面做的也不够好&#xff0c;所以有必要给大家分…

[转]将图片转换为 latex 公式

一、官网链接及使用方法 官网链接&#xff08;跨平台&#xff09;: Mathpix 公式截图快捷键截图生成 latex 公式--------------------- 作者&#xff1a;man_world 来源&#xff1a;CSDN 原文&#xff1a;https://blog.csdn.net/mzpmzk/article/details/84140617 版权声明&…

在SQL Server2005中使用 .NET程序集

昨天完成了一个最简单的在数据库中创建标量值函数,今天主要完成表值函数,存储过程和用户定义类型在和.NET结合下的使用方法.1,表值函数所谓表值函数就是说这个函数返回的结果是一个Table,而不是单个的值.在.NET 中创建这样的函数,返回的结果是一个IEnumerable接口.这个接口非常…

AI作画的业界天花板被我找到了,AIGC模型揭秘 | 昆仑万维

一、前景 1、AI和AIGC的关系 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 AIGC是继 UGC、PGC 之后新型利用AI技术自动生成内容的生产…

【ArcGIS微课1000例】0022:ArcGIS点(点坐标)自动连成线操作案例教程

ArcGIS中,可以将带三维坐标(X、Y、Z)的点/点集自动连成线,本文演示具体操作流程。 文章目录 实战演练GPS点数据下载实战演练 打开ArcMap软件,添加实验文件夹0022下的GPS轨迹点.shp矢量点数据(文末提供下载地址),该数据是由GPS RTK采集的河道点数据,首先需要将GPS点坐…