用C#创建一个屏幕保护程序
原文地址: http://www.harding.edu/fmccown/screensaver/screensaver.html
简介
一个Windows屏幕保护程序是根据接收到的命令行参数来显示一个配置窗体,或者一个预览窗体的简单的Windows应用程序。Windows屏幕保护程序以.scr为后缀名并且一般存储在Windows\system32目录下,如果你的是64位的版本,则存储在Windows\SysWOW64目录下。
这个教程会像你演示怎样用Visual Studio .NET中的C#语言创建一个屏幕保护程序。我们的屏幕保护程序会将同一行文本随机的在屏幕上的不同位置显示。用户能够更改我们保存在注册表中用来显示文本的内容。这个教程假设你对Visual Studio 和C#有些熟悉。
如果你赶时间并且只想下载已经完成的项目,点击这里,解压这个文件夹,在Visual Studio中载入解决方案(我的项目使用 VS 2010创建的)。
这是我在几年前写的这个修正后的屏幕保护程序教程。非常感谢对修正我的教程很有帮助的Jacob Jordan'sMaking a C# screensaver教程,同时我也在Lucian Wischik's 的文章中发现了一些有用的技巧,How to write a 32bit screen saver.
准备开始
尽管我们可以用.NET编程语言中的任意一种来开发一个屏幕保护程序,但在这我们将使用C#编程语言。
首先启动Visual Studio(我将会用VS 2010,但是Visual C#2010学习版也可以)并且创建一个名字为ScreenSaver的Widnows窗体应用程序。
接下来,双击解决方案资源管理器中的Program.cs 文件。这个文件包含主函数,是.NET执行的入口点:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); }
Application.Run() 调用上面的实例Form1窗体并不断循环执行,处理窗体信息。当窗体被关闭时,方法返回值并且程序终止。
我们很快会对这个循环进行修改,但是,在修改之前,我们首先重命名 Form1 为更有描述性的文字。用鼠标选中文字“Form1”并按F2。输入ScreenSaverForm作为这个窗体的新名称并确定。
命令行参数
注意简介中的信息,一个屏幕保护程序接收命令行参数来选择哪个"模式"应该被执行。这里有三个可以使大写或小写的命令行参数:
1. /p - 显示屏幕保护程序在屏幕保护程序的选择对话框中
2. /c - 显示屏幕保护程序的配置对话框
3. /s - 全屏显示屏幕保护程序
如果没有传递任何参数,屏幕保护程序默认提供/C
如果传递的是参数/p,一个十六进制的数作为父窗体的句柄也被传递。例如,我们的屏幕保护程序可能传递/p 1234567。一个窗体句柄也可能通过/c传递。或者,这个窗体的句柄也可能在第一个参数和句柄中使用逗号来传递。一些例子:/p:1234567 和 /c:7654321。因此我们需要处理这些情况。
让我们来重写Main方法以便于它接收命令行参数并分别处理这三个参数。用下面的代码覆盖Main方法的全部内容。
static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); if (args.Length > 0) { string firstArgument = args[0].ToLower().Trim(); string secondArgument = null; // Handle cases where arguments are separated by colon. // Examples: /c:1234567 or /P:1234567 if (firstArgument.Length > 2) { secondArgument = firstArgument.Substring(3).Trim(); firstArgument = firstArgument.Substring(0, 2); } else if (args.Length > 1) secondArgument = args[1]; if (firstArgument == "/c") // Configuration mode { // TODO } else if (firstArgument == "/p") // Preview mode { // TODO } else if