网站运营优化 » 编程 » 屏保程序模板化完整VB源代码

屏保程序模板化完整VB源代码

屏保程序模板化完整VB源代码

熟悉Windows操作系统的朋友一定对Windows的屏保程序不陌生,喜欢VB编程的朋友也一定想编写一个自己的Windows屏保程序。其实屏保程序实质上仍然是一个Windows的可执行程序,理论上说你可把自己的任何一个现成的程序作品改造成屏保程序,当你看完下面的讲解后便可以轻易地编写或是改造一个标准的Windows屏保程序了!

一个标准的Windows屏保程序应该具备如下特点:

1、扩展名必须是.scr,程序放置在Windows或者是System目录下。

2、常规的屏保程序由运行主窗体、设置窗体和更改密码窗体三个窗体组件构成,屏保程序在运行前必须中止它的前一个可能在运行中的程序副本。

3、屏保主程序运行于全屏幕状态,主窗体无标题栏,背景一般为黑色。

4、屏保程序运行时隐藏鼠标指针,程序退出(或处理用户输入密码)时显示鼠标。

5、屏保程序运行时应该禁止使用特殊功能键如重启键、Windows菜单键等,程序退出时恢复这些功能键。

6、屏保主程序运行时主窗体及它的所有可视控件接受键盘事件KeyDown、鼠标事件MouseDown、MouseDown时能自动终止程序运行(如果设置了密码保护应该触发对应的密码处理模块并响应用户的交互)。

7、屏保程序有四种运行方式,就是:①运行在预览框中(用于预览屏保的效果——在“显示属性”→“屏幕保护程序”→“小屏幕”);②运行设置程序(用于设置一些相关的样式——在“显示属性”→“屏幕保护程序”→“设置”);运行密码更改程序(用于设置和修改屏保密码——在“显示属性”→“屏幕保护程序”→“密码保护”→“更改”);真正的运行屏保(屏保运行时的效果—在“显示属性”→“屏幕保护程序”→“预览”或鼠标、键盘在指定的时间内无动作时)。

8、屏保程序在启动以及处理设置、更改密码时还应该有对相关数据的存取功能(数据文件操作或注册表操作)。

正因为屏保程序具有的以上特殊性,设计制作一个标准的屏保程序要比制作一个普通的应用程序要考虑的事情多。我们可以把一个标准的屏保程序分成两大部分:决定程序运行效果的部分(以下简称“核心”代码,可以看成是一个标准的普通应用程序);区别于普通应用程序的特别处理部分(即屏保外壳,处理上述8点内容)。这里介绍的《屏保程序模板化完整源代码》提供给朋友们一个制作标准屏保外壳的程序源代码。此源代码标准模板化设计(以下简称“模板”),它本身就是一个“黑屏幕”的标准屏保程序。使用此“模板”,理论上可以把你的任何应用程序改造成屏保程序,你只需要在“模板”提示的地方选择添加上你的“核心”代码就可以了,快速、方便!

把一个现成的应用程序改造成屏保程序时需要把原程序窗体控件添加到相应的“模板”窗体中,将源代码分解后添加到“模板”代码中。但原程序中的有些代码在屏保程序中是无用的、或是不合理的(如上述三个窗体间切换部分就应该去掉,如果你是重新设计一个屏保程序,窗体间的切换工作也不必去作)。另外,如果你想让“预览”的小窗口中能有正常运行一样的效果,主窗体的“核心”代码在设计时就要有根据屏幕大小的变化自动调整程序运行效果的响应。如果只是能够简单的预览,这部分工作也可以省去。

作为示例本站还同时提供一个《时钟》程序的完全源代码供你亲自动手把它改造成屏保程序练习用,《时钟》源代码中加入了详细的改造说明,仔细分析这一实例代码相信对你制作屏保程序一定有不小的帮助。需要《时钟》程序的朋友可以从本站下载。

本套“模板”由三个窗体和一个通用模块共四部分组成。下面重点介绍“模板”的源代码及添加“核心”代码的方法。

通用模块Module1

这部分代码包含屏保程序的总入口Sub Main()。如前所述,屏保程序可以以四种不同的运行方式启动,无论程序以何种方式启动,新的启动程序必须先行检测是否有前一个副本的程序模块在运行,如果有就中止它的运行,然后重新启动新的屏保程序模块。

屏保程序的运行状态由用户选择决定。当屏保以不同方式启动时Windows会赋予它不同的命令行参数,四种运行状态的命令行参数依次为/p、/c、/a和/s,获得此命令行参数后屏保程序就会决定激活哪一个程序模块。

模块Module1的前面的几个API函数和子过程就是完成以上任务的,这也是该模块的主要功能之一。

模块中还包含一个供主窗体和设置窗体调用的公有子程序(zhuce,这一部分用黑体标出),作用为:

1、主窗体运行状态(显示属性的小屏幕预览或屏保正常运行):取得命令行参数(/p或/s),调用zhuce,从模块中取得保存于注册表中的有关项目值的数据,在主窗体中初始化屏保“核心”程序相关变量。

2、设置窗体运行状态:取得命令行参数(/c),调用zhuce,从模块中取得保存于注册表中的有关项目值的数据,在设置窗体中初始化屏保设置窗体“核心”程序相关变量。

模块Module1中用黑体显示的部分就是完成以上任务的,这是该模块的主要功能之二。

此外,模块还完成包含“侦测当前屏保的运行方式”和“'卸载窗体结束程序”两个子程序供其它窗体代码调用。

重点说明:

“模板”的全部代码中只有屏保程序在注册表中的保存位置可以由用户选择修改(当然不修改直接使用默认也可),其它代码无需修改可直接用于你的屏保制作。“模板”操作注册表完成屏保设置参数的存取在注册表中的主键位置是:

HKEY_LOCAL_MACHINE\Software\Microsoft\zimu

其中的zimu就是默认的主键名,你不喜欢可以更改,但必须同时修改“设置”窗体和“更改”密码窗体中相应的注册表保存部分代码内容,建议在没“读懂”屏保代码之前不要修改,以防程序运行出错。该主键下的注册表项依次为canshu0-canshu10(“模板”为你准备了10个子项,相信足够你用的了,其中的canshu0专门用于记录屏保密码请勿变动);模块取出的变量数据存放在全局数组变量tmpVal(0-10)中(这11个变量都是字符串型的,可以被其它窗体代码调用)。另外,用此“模板”按下面介绍的方法制作屏保程序时建立的模块、窗体(包括窗体上的控件)名请勿更改,如果非要更改勿请在程序制作完成后用“搜索/替换”方法将原名在所有窗体及模块代码中替换为新名字,否则程序运行时会找不到对像。

下面具体介绍制作方法。

在VB开发环境下新建一个工程,VB会自动建立一个主窗体Form1。保存工程:按默认窗体文件名“Form1.frm”保存窗体文件;将工程文件名“工程1.vbp”修改为“pingbaomoban.vbp”(或你的需要名)保存工程文件。

在VB的“工程资源管理器”窗口中操作添加一个模块Module1,将下面的代码全部复制下来粘帖到模块代码窗口中。在“工程”菜单中选择“工程属性”→“通用”,将“启动对象”修改为“Sub Main”;选择“生成”项,将应用程序“标题”修改为“屏保模板化完全代码”(或你的需要名),在“命令行参数”中输入“/s”,按默认文件名Module1.bas保存模块文件。

    '模块Module1.bas——制作你的屏保程序时无需修改可直接使用,如果屏保程序还需要其它全局性的常量、变量、API函数声明或需要其它的模块,其内容既可插入在本模块中,也可单独建立另外一个新的模块文件
    Option Explicit
    Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
    Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long
    Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long
    Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
    Private Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByVal lpData As String, ByRef lpcbData As Long) As Long
    Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
    Private Declare Function RegQueryValueExA Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByRef lpData As Long, lpcbData As Long) As Long
    Public Const WM_LOOK = "小窗口预览"
    Public Const WM_SET = "参数设置"
    Public Const WM_RUN = "正常运行"
    Public Const WM_PASS = "设置密码"
    Global tmpVal(10) As String '串数组其中tmpVal(0)专用于保存屏保密码,tmpVal(1-10)可以保存屏保"核心"程序的10个设置参数,主显示窗口、"设置"和"更改"密码窗口直接使用这一数组变量用于注册表的保存。
    Global SAVEUSERPASS As Long '记录"显示"属性窗口"密码保护"复选框状态,值1为选中
    Global XXX, YYY As Long '记录"显示"属性窗口小屏幕尺寸
    Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
    End Type

    Sub Main() '程序运行总入口,根据命令行参数决定程序转子程序的去向
    Dim ClassName As String * 64 '存放窗口的类名
    Dim ExeCmd As String '存放命令行参数
    GetClassName Form1.hwnd, ClassName, 64 '取得窗口的类名
    ExeCmd = UCase(Command$) '将调用的屏保的参数转换成大写
    If Not (InStr(ExeCmd, "/P") = 0) Then '检查屏保的调用参数中是否有“/P”参数
    If Not (FindWindow(ClassName, WM_LOOK) = 0) Then CloseSCR '如果找到已有同一个运行方式的实例存在则程序结束
    ClosePreWindow ClassName, WM_SET '关闭前面已启动的其他运行方式的实例
    ClosePreWindow ClassName, WM_RUN '同上
    ClosePreWindow ClassName, WM_PASS '同上
    SCR_Look '命令行参数/P转显示属性窗口的"小屏幕显示"处理
    ElseIf Not (InStr(ExeCmd, "S") = 0) Then
    If Not (FindWindow(ClassName, WM_RUN) = 0) Then CloseSCR
    ClosePreWindow ClassName, WM_LOOK
    ClosePreWindow ClassName, WM_SET
    ClosePreWindow ClassName, WM_PASS
    Scr_Run '命令行参数/S转显示属性窗口"预览"(与屏保的正常运行状态相同)处理
    ElseIf Not (InStr(ExeCmd, "C") = 0) Then
    If Not (FindWindow(ClassName, WM_SET) = 0) Then CloseSCR
    ClosePreWindow ClassName, WM_LOOK
    ClosePreWindow ClassName, WM_RUN
    ClosePreWindow ClassName, WM_PASS
    Scr_Setup '命令行参数/C转显示属性窗口"设置"处理
    ElseIf Not (InStr(ExeCmd, "A") = 0) Then
    If Not (FindWindow(ClassName, WM_PASS) = 0) Then CloseSCR
    ClosePreWindow ClassName, WM_LOOK
    ClosePreWindow ClassName, WM_RUN
    ClosePreWindow ClassName, WM_SET
    Scr_Pass '命令行参数/A转显示属性窗口的"更改"密码处理
    Else
    End
    End If
    End Sub
    Public Sub ClosePreWindow(ClassName As String, WinCaption As String) '关闭先前运行的同一个程序窗口
    Dim PreWnd As Long
    PreWnd = FindWindow(ClassName, WinCaption) '寻找类名为ClassName,标题为WinCaption的窗口
    If Not (PreWnd = 0) Then Call SendMessage(PreWnd, &H10, 0, 0) '如果窗口已找到则关闭它
    End Sub

    Public Sub SCR_Look() '小屏幕显示处理
    Dim LookScrWnd As Long
    Dim Style As Long
    Dim LookRect As RECT
    Form1.Caption = WM_LOOK '赋上具有相应运行方式的标题
    LookScrWnd = Val(Right(Command$, Len(Command$) - 2)) '取得小屏幕的窗口句柄
    Style = GetWindowLong(Form1.hwnd, -16) '取得窗口的样式
    Style = Style Or &H40000000 '在窗口的样式中加入子窗体常数
    SetWindowLong Form1.hwnd, -16, Style '改变窗体的样式
    SetParent Form1.hwnd, LookScrWnd '设置窗体的父窗体
    GetClientRect LookScrWnd, LookRect '取得小屏幕的大小
    SetWindowPos Form1.hwnd, 0, 0, 0, LookRect.Right, LookRect.Bottom, &H4 Or &H10 Or &H40 '显示窗体并将窗体的大小设置为小屏幕的大小
    XXX = LookRect.Right: YYY = LookRect.Bottom '取得小窗口尺寸赋于全局变量中
    Form1.Load '转到屏保小屏幕主显示窗体的初始化过程
    End Sub
    Public Sub Scr_Setup() '"设置"处理
    Form1.Caption = WM_SET
    Form2.Show '转到屏保设置窗体
    End Sub
    Public Sub Scr_Run() '"预览"或屏保的正常运行处理
    Dim a As Long
    Form1.Caption = WM_RUN
    ShowCursor False '隐藏鼠标
    a = SystemParametersInfo(97, True, CStr(1), 0) '关闭特殊功能键
    Form1.Move 0, 0, Screen.Width, Screen.Height '改变窗体位置及大小
    Form1.Load '转到屏保正常显示主窗体的初始化过程
    Form1.Show
    End Sub
    Public Sub Scr_Pass() '"更改"密码处理
    Form1.Caption = WM_PASS
    Form3.Show '转到屏保更改窗体
    End Sub

    Public Function Scan_RUN() As Boolean '侦测当前屏保的运行方式的子程序
    If (Form1.Caption = WM_RUN) Then '如果屏保是以运行方式在运行
    Scan_RUN = True
    Else
    Scan_RUN = False
    End If
    End Function

    Public Sub CloseSCR() '卸载窗体结束程序
    Dim a As Long
    ShowCursor True '显示鼠标
    a = SystemParametersInfo(97, False, CStr(1), 0) '恢复特殊功能键
    Unload Form3
    Unload Form2
    Unload Form1
    End
    End Sub

    Public Sub zhuce() '从注册表表中取出"设置"参数tmpVal(1-10)、"更改"的密码tmpVal(0)和"显示"属性窗口"密码保护"复选框状态SAVEUSERPASS
    Dim a As Long
    Dim rc(10) As Long
    Dim hKey As Long
    Dim KeyValType As Long
    Dim KeyValSize(10) As Long
    Dim c As String
    On Error GoTo 1
    a = RegOpenKeyEx(&H80000002, "Software\Microsoft\zimu", 0, 131135, hKey) 'zimu为程序运行参数在注册表中保存的主键名
    For a = 0 To 10
    tmpVal(a) = String$(1024, 0)
    KeyValSize(a) = 1024
    rc(a) = RegQueryValueEx(hKey, "canshu" + Trim(a), 0, KeyValType, tmpVal(a), KeyValSize(a))
    Next
    For a = 0 To 10
    tmpVal(a) = Left(tmpVal(a), InStr(1, tmpVal(a), Chr(0)) - 1) '整理得到的各参数字串值tmpVal(0-10)
    Next
    SAVEUSERPASS = 3 '以下'获得"显示"属性窗口"密码保护"复选框状态SAVEUSERPASS
    c = String$(1024, 0)
    a = RegOpenKeyEx(&H80000002, "Network\Logon", 0, 131135, hKey)
    rc(0) = RegQueryValueEx(hKey, "username", 0, KeyValType, c, 1024)
    c = Left(c, InStr(1, c, Chr(0)) - 1) '获取当前用户名c
    If c = "" Then '无网络用户
    a = RegOpenKeyEx(&H80000003, ".DEFAULT\Control Panel\desktop", 0, 131097, hKey)
    rc(0) = RegQueryValueExA(hKey, "ScreenSaveUsePassword", 0, 4, SAVEUSERPASS, 4)
    Else
    a = RegOpenKeyEx(&H80000003, c + "\Control Panel\desktop", 0, 131097, hKey)
    rc(0) = RegQueryValueExA(hKey, "ScreenSaveUsePassword", 0, 4, SAVEUSERPASS, 4)
    If SAVEUSERPASS = 3 Then '匿名登录
    a = RegOpenKeyEx(&H80000003, ".DEFAULT\Control Panel\desktop", 0, 131097, hKey)
    rc(0) = RegQueryValueExA(hKey, "ScreenSaveUsePassword", 0, 4, SAVEUSERPASS, 4)
    End If
    End If
    1
    a = RegCloseKey(hKey) '关闭注册表
    End Sub


主显示窗体Form1

展示屏保运行的具体效果:该窗体加载时用从注册表中取出的全局变量tmpVal(1-10)数据在Load()过程中初始化该窗体的程序变量,然后运行“核心”代码展示具体的屏保效果。

窗体:维持窗体名Form1不变,将背景设为黑色,Caption="",AutoRedraw=True,Borderstyle=0,ShowInTaskbar=False;放置一个时钟控件Timer1,Interval=100,以上未尽属性均可取默认值。

代码:主窗体“模板”代码如下,全部复制下来粘帖到Form1的代码窗口中,按默认文件名Form1.frm保存窗体文件。

如果你是用“模板”制作你的屏保程序,主窗体的其它控件请根据你的“核心”代码需要设计添加,主窗体的“核心”代码请在以数字序号开头的6处绿色注释位置选择添加。

    '主显示窗体Form1
    Option Explicit
    Dim YANSHI As Integer
    '①把屏保主窗体Form1的“核心”代码用到的窗口级变量、常量及API声明等内容写在下面:

    Public Sub Load() '主窗体启动入口,你的主显示窗体"核心"程序的Form_Load()过程中的初始化处理工作都要放到这一过程中
    Call Module1.zhuce '取得注册表保存的参数
    If Len(tmpVal(1)) > 0 Then '如果注册表项第一个“核心”代码参数值存在
    '②这里加入用全局变量tmpVal(1-10)初始化Form1窗体变量的代码,如果你的“核心”代码不需要使用“Form2”窗体设置屏保效果此处无需添加代码,否则主窗体初始化变量值请用tmpVal(1-10)调整设定。
    Else
    '③这里加入用默认的初始化参数初始化Form1窗体变量的代码(用于无法从注册表中取出参数值时用)
    End If
    '④如果你的主运行窗体Form1还有其它变量声明及初始值需要设定就写在这里(如果要兼顾全屏显示的正常状态和小屏幕显示的预览状态的效果,代码也可放在这里处理)
    End Sub

    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) '响应键盘事件
    If Module1.Scan_RUN Then Call mima
    End Sub
    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) '响应鼠标点击事件
    If Module1.Scan_RUN Then Call mima
    End Sub
    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) '响应鼠标移动事件
    If YANSHI > 0 Then Exit Sub
    Static currentX, currentY As Single
    Dim orignX, orignY As Single
    orignX = X
    orignY = Y
    If currentX = 0 And currentY = 0 Then
    currentX = orignX
    currentY = orignY
    Exit Sub
    End If
    If (Abs(orignX - currentX) > 3 Or Abs(orignY - currentY) > 3) And Module1.Scan_RUN Then Call mima
    End Sub
    '⑤上述三个结束程序运行事件发生时转到接下来的子程序处理密码部分,如果你的屏保程序主窗体Form1上放置了其它“面积”较大且可视的控件应分别添加这三个事件,以使事件发生时能转到处理密码部分,否则这里可以免加代码
    Private Sub mima() '子程序:处理屏保密码
    Dim a
    a = ShowCursor(True) '显示鼠标
    If tmpVal(0) = "" Or SAVEUSERPASS = 0 Then '未设密码或“密码保护”复选框未选中
    a = SystemParametersInfo(97, False, CStr(1), 0)
    Module1.CloseSCR
    Else
    1
    a = InputBox("请输入屏保程序的密码:", "Windows 屏保程序")
    YANSHI = 2: Timer1.Enabled = True
    If a = tmpVal(0) Then
    a = SystemParametersInfo(97, False, CStr(1), 0)
    Module1.CloseSCR
    Else
    If a <> "" Then
    a = MsgBox("输入的密码不正确,请重新输入!", 0 + 48 + 0 + 0, "密码")
    GoTo 1
    Else
    a = ShowCursor(False)
    Timer1.Enabled = True
    End If
    End If
    End If
    End Sub
    Private Sub Timer1_Timer() '退出屏保当设置密码时如果按下取消按钮时的延时处理——避免反复出现提示窗口
    If YANSHI <= 2 And YANSHI > 0 Then YANSHI = YANSHI - 1 Else Timer1.Enabled = False
    End Sub

    Private Sub Form_Unload(Cancel As Integer) '关闭屏保
    Module1.CloseSCR
    End Sub

    '⑥从这往后是屏保主窗体Form1"核心"代码其它事件及过程全部写在这


设置窗体Form2

完成屏保“核心”程序运行参数的设置及保存:该窗体加载时调用模块中的zhuce,从模块中取得保存于注册表中的全局变量tmpVal(1-10)数据在Form_Load()过程中初始化该窗体的程序变量。更改设置后按确定钮将新参数保存于注册表中并中止程序运行。

窗体:在VB的“工程资源管理器”窗口中操作添加一个新窗体,维持默认窗体名Form2,Caption="屏保设置",StartUpPosition=2,Borderstyle=3,ShowInTaskbar=False;放置一个标签Label1,Caption="此屏保程序不需设置",5号粗体,AutoSize=True;放置两个命令按钮Command1和Command2,Caption分别设置为“确定”和“取消”,以上未尽属性均可取默认。

代码:将下面代码全部复制下来粘帖到代码窗口中,按默认文件名Form2.frm保存窗体文件。

如果不需要对你的屏保程序运行效果进行设置那么设置窗体的这些控件的代码就够用了,此时以下窗体代码中需要添加“核心”内容的部分可全部留空,设置窗体启动时显示如右图所示。如果是用“模板”制作你的屏保程序需要对屏保程序运行效果进行设置,请删除Label1控件再按“核心”内容需要在窗体中增加相应控件并在下面窗体代码中添加相关程序代码。

屏保的设置与屏保的“核心”代码密切相关,虽“模板”亦无法完全取代不可欲知的设置方式,下面重点介绍当你需要对屏保程序运行效果进行设置时如何实现你的“核心”程序代码与“模板”的接合方法:

1、在窗体Form_Load()事件的位置①处加入用从注册表中取得的tmpVal(1-10)数据初始化本窗体变量的代码;在位置②处加入用默认的初始化参数值初始化本窗体变量的代码;在位置③后加入其它“核心”代码所需的变量初始值设定。

2、在位置④处加入保存参数的语句。

3、在位置⑤以后加入本窗体其它“核心”程序的设置代码。

    '设置窗体Form2
    Option Explicit

    Private Sub Form_Load() '"设置"窗口启动入口,你的"核心"程序的Form_Load()过程中的初始化处理工作都要放到这一过程中
    Call Module1.zhuce '取得注册表中的设置参数值
    If Len(tmpVal(1)) > 0 Then '如果从注册表找到了保存的参数
    '①这里加入用全局变量tmpVal(1-10)初始化此设置窗体变量的代码,你的"核心"程序主窗体初始化变量值请用tmpVal(1-10)调整设定
    Else
    '②这里加入用默认的初始化参数初始化此窗体变量的代码(用于无法从注册表中取出参数值用)
    End If
    '③如果你的设置窗体还有其它变量声明及初始值需要设定就写在这里
    End Sub

    Private Sub Command1_Click() '设置窗口的"确定"按钮。你的"核心"程序中"确定"按钮的代码只需要调整为用本过程方法保存你需要的设置参数即可
    '④按下确定钮将所有在设置窗口设置好的参数保存在注册表zimu主键下,项目依次为canshu1-canshu10。通用模快中欲先设定了10个参数的数组,你的程序有几个需要保存的参数就用几个,要注意项目名要和主窗体及模块中的该数组变量作好一一对应。
    '这里提供了一条在注册表中保存项目的语句,只需要按此格式操作即可:
    'CreateObject("WScript.Shell").regWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\zimu\canshu1,字串1,"REG_SZ"
    Module1.CloseSCR
    End Sub

    Private Sub Command2_Click() '按下取消钮。你的“核心”代码中的“取消”过程全部舍弃
    Module1.CloseSCR
    End Sub

    '⑤你的设置窗体其它过程代码全部写在这以后


更改密码窗体Form3

完成屏保密码的设置与保存

窗体:在VB的“工程资源管理器”窗口中操作添加一个新窗体,维持默认窗体名Form3,Caption="更改密码",Borderstyle=3,StartUpPosition=2,ShowInTaskbar=False;放置三个标签Label1-3,Caption依次为"更改 Windows 屏保程序的密码"、"新密码(&N):"、"确认新密码(&F),"AutoSize="True";放置两个文本框Text1和Text2,Text="",PasswordChar="*";再放置两个命令按钮Command1和Command2,Caption分别设置为“确定”和“取消”(以上未尽属性均可取默认),如上图所示调整好控件大小及布局。

代码:将下面代码全部复制下来粘帖到代码窗口中,按默认文件名Form3.frm保存窗体文件。

本窗体代码无需任何修改可直接使用,运行时显示效果如上图所示。

    '密码设置窗体Form3——制作你的屏保时本窗体及代码均无需修改可直接使用,
    Option Explicit

    Private Sub Command1_Click() '确定按钮
    Dim a As Integer
    If Text1.Text <> Text2.Text Then
    a = MsgBox("确认密码与设定密码不符!", , "Microsoft Windows")
    Text1.Text = "": Text2.Text = ""
    Else
    CreateObject("WScript.Shell").regWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\zimu\canshu0", Text1.Text, "REG_SZ" '在主键zimu下的注册表项canshi中保存密码字符串
    a = MsgBox("已经成功地更改了密码!", 0 + 64 + 0 + 0, "Microsoft Windows")
    Module1.CloseSCR
    End If
    End Sub

    Private Sub Command2_Click() '取消按钮
    Module1.CloseSCR
    End Sub
    Private Sub Form_Unload(Cancel As Integer) '关闭窗口
    Module1.CloseSCR
    End Sub

好了,一个标准的屏保程序编写完成了。我们可以通过“工程”→“属性”→“生成”,在“命令行参数”中输入相应的命令行参数后在设计状态下预览效果(记注,屏保程序在设计状态下有些功能是无法看到的)。将刚才输入的命令行参数去掉就可以编译程序了(不要忘了生成EXE文件时一定要将屏保的扩展名改为SCR并将其拷贝到Windows或者System目录下)。打开“显示属性”对话框看一看自己制作的屏保程序怎么样?!

本套模板在VB60、Windows98中调试通过,本站同时提供一个包含详细改造成屏保的注释的《时钟》程序完全代码供需要的朋友下载实验。

最后提醒朋友们,一个好的屏保程序即要符合屏保程序的各项要求,还要有一个好的创意构造你的“核心”代码,这只能是各取所好,各尽其能了。本站提供的也只是一个制作屏保的模板和一个简单的具体的实例作品,如果你在创作中遇到什么问题的话欢迎与我联系,我的主页:http://qipinw.126.com,邮箱:[email protected]

河北 王学军

相关文章

发表留言


点击更换验证码