API 过 程 能 够 确 定 系 统 中 是 否 有 另 外 的 应 用 程 序 正 在 运 行。 它 需 要 两 个 字 符 串 参 数, 一 个 表 示 应 用 程 序 的 类 名, 另 一 个 表 示 窗 口 的 标 题 栏:
Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
---- 下 面 的 代 码 展 示App.PreInstance 和FindWindow 是 如 何 典 型 地 在 一 个 屏 幕 保 护 程 序 中 实 现 的。
Private Sub CheckShouldRun()
注释:如果屏幕保护
程序已运行,退出
If Not App.PrevInstance Then Exit Sub
注释:确定系统中是否有同名的屏幕保护
程序正在运行
If FindWindow(
vbNullString, APP_NAME) Then End
注释:设置实例名称
frmCover.Caption = APP_NAME
End Sub
---- 三、 在 屏 幕 保 护 程 序 中 隐 藏 鼠 标
---- ShowCursor API 函 数 允 许 在Visual Basic 应 用 程 序 中 隐 藏 或 显 示 鼠 标, 每 次 用 参 数 值True 或False 调 用ShowCursor 可 以 使 鼠 标 显 示 或 隐 藏。 以 下 是ShowCursor API 函 数 的 声 明:
Declare Function ShowCursor Lib "user32"
(ByVal bShow As Long) As Long
---- 四、 检 测 鼠 标 的 移 动
---- 鼠 标 的 移 动 在 屏 幕 保 护 模 式 时, 需 要 退 出 程 式, 但 在 预 显 模 式 时, 不 对 程 序 有 影 响, 所 以 设 置RunMode 全 局 变 量 来 确 定 鼠 标 对 程 序 是 否 起 作 用。MouseMove 事 件 用 来 检 测 鼠 标 的 移 动, 当 应 用 程 序 启 动 时 甚 至 鼠 标 实 际 上 并 未 移 动 的 情 况 下,MouseMove 事 件 都 会 触 发 一 次。 所 以 触 发MouseMove 事 件 时, 只 是 记 录 鼠 标 当 前 位 置, 仅 当 鼠 标 真 正 从 其 起 始 位 置 移 开 一 个 较 大 位 移 时, 才 终 止 屏 幕 保 护 程 序。 具 体 实 现 代 码 如 下:
Private Sub Form_MouseMove(Button As Integer,
Shift As Integer, x As Single, y As Single)
Static x0 As Integer
Static y0 As Integer
注释:非屏幕保护模式退出过程
If RunMode < > rmScreenSaver Then Exit Sub
注释:大的鼠标移动退出
程序If ((x0 = 0) And (y0 = 0)) Or _
((Abs(x0 - x) < 5) And (Abs(y0 - y) < 5)) _
Then
注释:小的鼠标移动
x0 = x
y0 = y
Exit Sub
End If
Unload Me
End Sub
---- 五、 设 置 参 数 的 读 取 和 保 存
---- 在Visual Basic 中,SaveSetting 函 数 提 供 了 在 Windows 注 册 表 中 保 存 或 建 立 应 用 程 序 私 有 参 数 的 功 能。 其 语 法 为:
SaveSetting appname, section, key, setting
---- SaveSetting 函 数setting 的 值 保 存 在 如HKEY_CURRENT_USER\Software\VB and VBA Program Settings\appname\section\key 下。
---- GetSetting 函 数 提 供 在 Windows 注 册 表 中 读 取 应 用 程 序 私 有 参 数 的 功 能。 其 语 法 为:
GetSetting(appname, section, key[, default])
---- 如 果 GetSetting 的 参 数 中 的 任 何 一 项 都 不 存 在, 则 GetSetting 返 回 default 的 值。 如 果default 值 省 略, 则 返 回 长 度 为 零 的 字 符 串 ("")。
---- 程 序 中 应 用 如 下:
Public Sub SaveConfig()
注释:保存设置参数到
注册表中
SaveSetting APP_NAME, _
"Settings", "NumBalls", Format$(NumBalls)
End Sub
Public Sub LoadConfig()
注释:从注册表中读取参数,如果没有设置,默认值为1
NumBalls = CInt(GetSetting(APP_NAME, _
"Settings", "NumBalls", "1"))
End Sub
---- 六、 小 屏 幕 预 显 窗 口 实 现
---- 要 将