在Linux实验室工作时,注意到了一个屏幕保护程序,它在屏幕上显示了一堆彩色的数字和字母,这些数字和字母会周期性地闪烁和变化。能看出这是一种程序解释器,循环的脉冲正在运行代码,但除此之外一无所知。
过了一段时间(并不太久),突然有了编写类似屏幕保护程序的冲动。朋友一个接一个地否定了点子,然后建议做一个原始Linux屏幕保护程序的移植。这正是所做的。
Windows虚拟机(WVM)屏幕保护程序是在GNU通用公共许可证(GPL)下分发的。它至少需要Windows NT 4.0和DirectX8.0才能运行。源代码以Visual C++6.0格式提供。原始屏幕保护程序是由Artur Rataj编写的,名为KVM。
如果想运行屏幕保护程序,请将wvm.scr解压到系统目录(可能是C:\WINDOWS\SYSTEM32)。然后右键点击桌面,选择属性,点击屏幕保护程序标签。从列表中选择虚拟机屏幕保护程序。现在可以点击设置来更改模拟参数,点击测试来查看屏幕保护程序,点击确定将其设置为屏幕保护程序。
要详细了解屏幕保护程序的实际功能,请在设置对话框中点击帮助。那里有从用户的角度来看相当详尽的解释。下面是一个从程序员的角度进行的概述。
屏幕保护程序分为四个主要模块:
ScreenSaver:这是入口点模块。与scrnsave.lib链接的屏幕保护程序需要实现ScreenSaverProc函数。当屏幕保护程序启动和终止时会调用这个函数。由于屏幕保护程序需要进入一个持续运行的循环才能工作,这个函数启动一个线程来处理屏幕保护程序的其余部分,并立即返回。在终止时,它销毁线程并结束屏幕保护程序。
线程创建一个ScreenSaver类的实例,这是一个单例(一次只能存在一个实例)。然后它调用实例上的Heartbeat函数,这是屏幕保护程序的主循环。这个循环通过调用Behave来不断更新虚拟机,然后请求屏幕绘制。
Settings:这个模块处理设置对话框和注册表的读写。ScreenSaverConfigureDialog,另一个必需的屏幕保护程序函数,通过一个静态的Settings对象进行了增强。这个模块可能需要稍微整理一下,但它做得很好。
Display:几乎所有的DirectX代码都包含在这个模块中。感兴趣的项目是单例Display类。代码非常少,因为屏幕保护程序不需要处理丢失设备的问题。构造函数初始化Direct3D和设备,Paint函数为绘制做准备,Blt函数很好地完成了2D精灵的绘制工作。
Simulator:这个模块是屏幕保护程序的核心。大部分代码直接从Linux原始代码中提取。如果想真正理解它,必须深入代码。会指出主要的里程碑。
每次主循环重复时,Behave被调用。它反过来调用DoCycle,更新虚拟机的状态。它还更新所有效果。
效果是添加到屏幕保护程序的一个功能,原始版本中没有。本质上,效果是一个Effect结构的链表。它们与虚拟机本身分开更新,并在其上绘制。