65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows 虚拟机屏幕保护程序

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.38/5 (17投票s)

2004年1月15日

3分钟阅读

viewsIcon

151647

downloadIcon

3157

一个很酷的 Linux 屏保的 Windows 版本。

Screenshot

引言

我曾经在学校的 Linux 实验室工作时看到一个非常酷的 Linux 屏保。屏幕上布满了各种彩色的数字和字母,它们会周期性地闪烁和变化。我能看出它是一种程序解释器,而且那些循环闪烁的是正在运行的代码,但除此之外我就一无所知了。

过了一段时间(不久前),我产生了写一个类似屏保的冲动。我的朋友一个个否定了我的想法,然后建议我移植那个原始的 Linux 屏保。这正是我所做的。

Windows 虚拟机 (WVM) 屏保在 GNU 通用公共许可证 (GPL) 下分发。它至少需要 Windows NT 4.0 和 DirectX 8.0 才能运行。源代码以 Visual C++ 6.0 格式提供。原始屏保由 Artur Rataj 编写,名为 KVM。

入门

如果你想让屏保正常运行,请将 wvm.scr 提取到你的系统目录(通常是 C:\WINDOWS\SYSTEM32)。然后右键单击桌面,选择属性,然后单击屏幕保护程序选项卡。从列表中选择虚拟机屏幕保护程序。现在你可以单击设置来更改模拟参数,单击测试来查看屏保,然后单击确定将其设置为你的屏保。

有关屏保具体功能的详细信息,请单击设置对话框中的帮助。那里有从用户角度进行的相当详尽的解释。接下来是从程序员角度的概述。

框架

屏保分为四个主要模块

  • Display.cpp / Display.h
  • ScreenSaver.cpp / ScreenSaver.h
  • Settings.cpp / Settings.h
  • Simulator.cpp / Simulator.h

ScreenSaver

这是入口模块。需要链接 scrnsave.lib 的屏保必须实现 ScreenSaverProc 函数。当屏保启动和终止时会调用此函数。由于屏保需要进入一个不断运行的循环才能工作,因此此函数会启动一个处理屏保其余部分并将立即返回的线程。终止时,它会销毁线程并结束屏保。

该线程创建一个 ScreenSaver 类的实例,该类是一个单例(一次只能存在一个实例)。然后,它在该实例上调用 Heartbeat 函数,该函数是屏保的主循环。此循环通过调用 Behave 更新虚拟机,然后请求屏幕绘制。

设置

此模块处理设置对话框以及注册表的读取和写入。ScreenSaverConfigureDialog,另一个必需的屏保函数,由一个静态的 Settings 对象增强。此模块可能需要稍作整理,但它能很好地完成工作。

显示

几乎所有的 DirectX 代码都包含在此模块中。有趣的部分是单例 Display 类。代码非常简洁,因为屏保不需要处理设备丢失。构造函数初始化 Direct3D 和设备,Paint 函数为绘制准备设备,Blt 函数巧妙地实现了 2D 精灵的绘制。

模拟器

此模块是屏保的核心。大部分代码直接取自 Linux 原版。如果你想真正理解它,你必须深入代码。但我会指出一些主要的地标。Behave 在主循环的每次重复时被调用。它又调用 DoCycle 来更新虚拟机状态。它还更新所有效果。

Effects 是我对屏保的补充,在原版中没有。本质上,效果是 Effect struct 的链表。它们与虚拟机本身分开更新,并绘制在虚拟机之上。

结论

以上就是 Windows 虚拟机屏保的概述。通过自己钻研代码,你将受益最多。如果你有任何具体问题,请随时提出,我会进行更详细的说明。

祝您编码愉快!

© . All rights reserved.