当前位置: 首页 > news >正文

使用 WPF 开发一个 Windows 屏幕保护程序

最近有小伙伴问我如何可以让 Windows 静置一段时间不操作之后,显示一个特殊的界面。我想了想,屏幕保护程序可以做到这一点,而且,屏幕保护程序的开发也是非常简单的。

本文将介绍如何为 Windows 这一悠久的功能进行开发。


本文内容

      • 屏幕保护程序的本质
      • 安装屏幕保护程序
      • 处理屏幕保护程序参数
      • 请预防一些坑
        • 参考资料

屏幕保护程序的本质

屏幕保护程序本质上就是一个 Win32 窗口应用程序。

好了,这一节真的结束了……

屏幕保护程序的本质

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

安装屏幕保护程序

现在,在你的 scr 程序上点击右键,可以看到一个 “安装” 选项,点击之后就安装了。

安装屏幕保护程序

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

首次运行的屏幕保护程序

为了方便截图,我调了下窗口大小。实际上本应该是 Visual Studio 创建的空 WPF 程序的默认大小。

处理屏幕保护程序参数

我的屏幕保护程序是一个非常简单的程序,几乎就是默认的模板。只是,现在加上了一点文字,输出命令行参数。

<Window x:Class="Walterlv.DirextXDemo.Wpf.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"
        mc:Ignorable="d"
        Title="Walterlv.ScreenSaver" Height="450" Width="800">
    <Grid>
        <TextBlock x:Name="ArgsTextBlock" VerticalAlignment="Center" TextAlignment="Center" />
    </Grid>
</Window>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Loaded += OnLoaded;
    }

    private async void OnLoaded(object sender, RoutedEventArgs e)
    {
        var args = Environment.GetCommandLineArgs().Skip(1).ToArray();
        Args.Text = string.Join(Environment.NewLine, args);
    }
}

在前面的截图中,我们看到参数是 “/p 8457636”,这是表示此程序需要在预览窗格中进行预览。

还有其他参数,用于处理其他情况:

  • /s 屏幕保护程序开始,或者用户点击了 “预览” 按钮
  • /c:463970 用户点击了 “设置” 按钮
  • /p 8457636 用户选中屏幕保护程序之后,在预览窗格中显示

屏幕保护程序参数

实际上屏幕保护程序开始和预览是不同的。预览的时候,只会启动你的程序;而实际开始的时候,Windows 会先为你创建一个白色的背景,覆盖所有的屏幕,然后你的屏幕保护程序窗口显示在那个白色的背景之上。

实际上运行时,后面有白色的背景

请预防一些坑

你可能会发现 Windows 自带的屏幕保护程序在 C:\Windows\System32 文件夹中。但!那不是你放屏幕保护程序的地方!如果把你的屏幕保护程序拷贝到那个 Windows 的受信任目录下,你的程序是无法运行起来的。正确的做法,是右键,使用 “安装” 选项进行安装。

我后面附的链接中可能说屏幕保护程序还要有一些其他的要求,例如必须全屏、不要显示到任务栏等等。但那其实并不是强制性的要求,比如本文就显示了一个普通的窗口。


参考资料

  • Create a screensaver with .NET and WPF

我的博客会首发于 https://walterlv.com/,而 CSDN 和博客园仅从其中摘选发布,而且一旦发布了就不再更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://blog.csdn.net/wpwalter),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 在 Windows 10 中开启移动 WLAN 热点
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • 在 Roslyn 分析语法树时添加条件编译符号的支持
  • 自然码的形码
  • 出于迁移项目的考虑,GitHub 中 Fork 出来的项目,如何与原项目断开 Fork 关系?
  • 只需 5 秒钟,你就能取到 WPF 程序的超高分辨率超高清截图
  • 谨慎使用 FileInfo.Exists 实例方法,而是使用 File.Exists 静态方法替代
  • UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等)
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • int? 竟然真的可以是 null!.NET/C# 确定可空值类型 NullableT 实例的真实类型
  • Slack 开发入门之 Incoming Webhooks:往 Slack 的 Channel 中发消息
  • 三值 bool? 进行与或运算后的结果
  • 为什么我们不应该使用微信或者 QQ 作为团队协作的 IM 工具?
  • 通过重写预定义的 Target 来扩展 MSBuild / Visual Studio 的编译过程
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • express + mock 让前后台并行开发
  • Fabric架构演变之路
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • mysql外键的使用
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Vim 折腾记
  • 第2章 网络文档
  • 浮动相关
  • 聊聊sentinel的DegradeSlot
  • 微信开源mars源码分析1—上层samples分析
  • 我是如何设计 Upload 上传组件的
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • !!Dom4j 学习笔记
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #14vue3生成表单并跳转到外部地址的方式
  • #laravel 通过手动安装依赖PHPExcel#
  • $GOPATH/go.mod exists but should not goland
  • (1)Nginx简介和安装教程
  • (Forward) Music Player: From UI Proposal to Code
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (转)3D模板阴影原理
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)Windows2003安全设置/维护
  • (转)大型网站架构演变和知识体系
  • .net Application的目录
  • .net连接MySQL的方法
  • .NET企业级应用架构设计系列之技术选型
  • [ 数据结构 - C++] AVL树原理及实现
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [android] 看博客学习hashCode()和equals()
  • [Android]How to use FFmpeg to decode Android f...
  • [Android]使用Android打包Unity工程
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [C++]Leetcode17电话号码的字母组合