我的编程空间,编程开发者的网络收藏夹
学习永远不晚

利用WPF实现Windows屏保的制作

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

利用WPF实现Windows屏保的制作

介绍

框架使用.NET452

Visual Studio 2019;

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

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

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

正文

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

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

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

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

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

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

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

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

实现代码

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

到此这篇关于利用WPF实现Windows屏保的制作的文章就介绍到这了,更多相关WPF制作Windows屏保内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

利用WPF实现Windows屏保的制作

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

利用Python制作自已的动态屏保

这篇文章主要为大家详细介绍了如何利用Python制作自已的动态屏保,文中的示例代码讲解详细,对我们学习Python有一定的帮助,需要的可以参考一下
2022-12-20

如何使用Python制作自已的动态屏保

这篇文章主要介绍“如何使用Python制作自已的动态屏保”,在日常操作中,相信很多人在如何使用Python制作自已的动态屏保问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Python制作自已的动态屏保
2023-07-04

Python利用reportlab实现制作pdf报告

这篇文章主要为大家详细介绍了reportlab生成流文件格式、reportlab分页和图片流文件写入reportlab等内容,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2022-12-23

Python利用xlwings实现考勤表制作

这篇文章主要为大家详细介绍了Python如何利用xlwings库操作excel实现考勤表的制作,文中的实现步骤讲解详细,感兴趣的可以尝试一下
2023-05-18

利用Python实现无损GIF动图的制作

这篇文章主要为大家详细介绍了如何利用Python实现无损GIF动图的制作,文中的实现方法讲解详细,对我们学习Python有一定的帮助,需要的可以参考一下
2023-05-15

利用Windows To Go实现随身定制化电脑

很多人对电脑都有自己的使用习惯,但毕竟特殊情况或是其他一些问题,需要使用别人的电脑,这里小编就给大家一个方法,随便谁的电脑,只需要一个U盘或者移动硬盘,就能让它成为自己的定制化电脑。简单说,我们就是要利用Windows To Go来实现。
2023-05-21

利用ANSI控制码实现彩色的Windows启动菜单

电脑启http://www.cppcns.com动菜单选项默认一般都是白色的,但我http://www.cppcns.com们可以修改C盘根目录下的boot.ini(隐藏文件)可以使用ANSI控制码来控制启动菜单显示出彩色。现在就讲解一下根
2023-05-29

Python利用pynimate实现制作动态排序图

这篇文章主要为大家详细介绍了Python如何利用pynimate实现制作动态排序图,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2023-02-01

C#wpf使用ffmpeg命令行实现录屏的示例代码

本文主要介绍了C#wpf使用ffmpeg命令行实现录屏的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022-11-13

怎么利用python实现windows的批处理及文件夹操作

今天就跟大家聊聊有关怎么利用python实现windows的批处理及文件夹操作,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.批量处理所谓的批处理就是批量处理cmd里面的命令。py
2023-06-22

JS+Canvas实现满屏爱心和文字动画的制作

Canvas 适合绘制大数据量图形元素的图表(如热力图、地理坐标系或平行坐标系上的大规模线图或散点图等),也适合实现某些视觉特效。本文就来利用Canvas实现满屏爱心和文字动画的制作,感兴趣的可以了解一下
2022-11-21

怎么在springBoot中利用service实现层事务控制的操作

怎么在springBoot中利用service实现层事务控制的操作?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。springBoot使用事物比较简单,在Appl
2023-06-06

win7中制作ubuntu 1210启动盘(利用Power ISO 5.5实现)

问题: 桌面系统为WIN7旗舰版,使用如下工具制作Ubuntu 1210启动盘: 1. U编程niversal USB Installer 1.9.3.0; 2. Lili USB Creator 2.8.19; 制作完成后,拿到PC机上修
2023-05-30

免费在 Windows 11 上进行屏幕录制的实用指南

如何在 Windows 11 上进行屏幕录制转到 Windows 11 的设置栏并输入截图工具。打开截图工具。打开截图工具后,转到顶部栏,然后单击相机图标以选择屏幕录制功能。接下来,单击“+ 新建”按钮并选择要录制的区域。选择后,单击“开始
2023-08-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录