利用VB编写屏幕保护程序

编程 专栏收录该内容
54 篇文章 0 订阅
利用VB编写屏幕保护程序
http://www.tongyi.net  作者:刘明    点击:628  


  熟悉Windows操作系统的朋友一定对Windows的屏幕保护程序不陌生吧。如何自己编写Windows屏幕保护程序呢?当你看完下面的讲解后便可以轻易地编写一标准的Windows屏幕保护程序了! 
  一个标准的屏保有以下几个特点: 
  一:它是以.SCR作为文件的扩展名! 
  二:它有三种运行方式。 
  (1)运行在预览框中(用于预览屏保的效果。在“显示属性”→“屏幕保护程序”→“小屏幕”)。(见图) 
  (2)运行设置程序(用于设置一些相关的样式。在“显示属性”→“屏幕保护程序”→“点击设置按钮”)。 
  (3)真正的运行屏保(屏保运行时的效果。在“显示属性”→“屏幕保护程序”→“点击预览”或鼠标、键盘在指定的时间内无动作时)。 
  如何让屏保识别当前需要运行哪一种方式呢?答案很简单——分析Windows调用屏保的参数。下面以Windows 98为例向大家分析一下调用屏保的参数。 
  当Windows需要屏保显示在“小屏幕”中时会在调用屏保的后面加上两个参数。 
  如:myscr.scr /p 7981(参数一:/p 表示让程序显示在“小屏幕”里,参数二:7981表示“小屏幕”的句柄hWnd。这样屏保就会得知Windows要它显示在“小屏幕”中。) 
  当Windows需要屏保显示设置对话框时会在调用屏保的后面不加或加上两个参数。 
  如:myscr.scr或myscr.scr /C 7987(参数一:/C表示让程序显示设置对话框,参数二:7987表示该属性页的句柄。) 
  当Windows需要运行屏保时会在调用屏保的后面加上一个参数。 
  如:myscr.scr /S(参数:/S表示让屏保运行。) 
  好了,知道了Windows如何让屏保运行的三种方式后,接下来就要讨论如何实现它们了。 
  实现原理:Windows通过某种方式调用屏保,屏保知道了它此时要干什么便会在当前环境中搜索是否有相同的实例存在。如果该实例的运行方式与此次要启动的运行方式不同则关闭前个实例,如果该实例的运行方式与此次要启动的运行方式相同则关闭此次运行的实例。 
  显然要实现这种方法靠VB的App.PrevInstance是不可行的。因为我们要达到的目的是:侦测到前一个实例后要关闭它然后启动程序。而App.PrevInstance属性只能返回当前是否已启动一个应用程序的实例而不能对前个实例做些什么。(实例 简单地说就是相同的对象集合——同一程序。)在实现此方法之前首先向大家介绍三条API函数:GetClassName、FindWindow和SendMessage。其原型如下: 
  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 
  GetClassName用于取得窗体的类名。调用成功后返回类名长度,失败返回零。函数需要三个参数:参数一.窗体的句柄,参数二.存放类名的缓冲,参数三.缓冲的大小。 
  FindWindow用于寻找窗体。调用成功后返回窗体的句柄,失败返回零。函数需要两个参数:参数一.窗体的类名,参数二.窗体的标题。 
  SendMessage用于向窗体发送一消息。函数需要四个参数:参数一.窗体的句柄,参数二:发送的消息名称,参数三、四.分别表示消息所附带的参数。 
  使用了这三个函数便可轻易地实现关闭前有一个已启动的实例从而达到我们的目的。 
  其次我们要实现如何让屏幕保护程序显示在预览框中(“小屏幕”)。 
  要让屏幕保护程序在预览框中显示必须动态地改变窗口的样式使之成为“小屏幕”的子窗体,这样才能使预览框关闭时得到关闭消息。动态地改变窗口的样式可以使用GetWindowLong、SetWindowLong和SetParent。 
  它们的原型如下: 
  Public Declare Function GetWindowLong Lib “user32” Alias “GetWindowLongA” (ByVal hwnd As Long, ByVal nIndex As Long) As Long Public Declare Function SetWindowLong Lib “user32” Alias “SetWindowLongA” (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Function SetParent Lib “user32” (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long 
  GetWindowLong的作用用于得到窗体的样式。调用成功后返回窗体的样式。函数需要两个参数:参数一.窗体的句柄,参数二.要取得窗体的样式只需使用常数GWL_STYLE。 
  SetWindowLong的作用用于设置窗体的样式。函数需要三个参数:参数一.窗体的句柄,参数二.要设置窗体的样式只需用常数GWL_STYLE,参数三.要设置窗体的样式。 
  SetParent的作用用于设置子窗体属于哪个父窗体。函数需要两个参数:参数一.子窗体的句柄,参数二.父窗体的句柄。 
  知道了以上两点就可编写出标准的屏保。(关于效果就看你自己的了!)纸上谈兵了一阵就要落实到真正的编程上了。为了着重讲解屏保的实现方法故将屏保的效果简单化。 
  首先新建一工程再添加一窗口,各属性设置如下: 
   窗口   名称    Caption BorderStyle 
   Form1   Frm_Setup   无 1 - None 
   Form2   Frm_Run  任意 1 - Fixed Single 
  其余属性均缺省。再在Frm_Run中添加一Timer控件,将该控件的名称改为Timer_Mov,Interval属性制改为500。 
  添加两个模块,将Module1的名称改为Mod_Const,Module2的名称改为Mod_Main,添加以下代码: 
  Mod_Const: 
  Option Explicit 
  Public Const WM_LOOK=“屏保预览(demo)” 
  Public Const WM_SET=“屏保设置(demo)” 
  Public Const WM_RUN=“屏保运行(demo)” 
  Public Const HWND_TOP=0& 
  Public Const WS_CHILD=&H40000000 
  Public Const GWL_STYLE=(-16) 
  Type RECT 
   Left As Long 
   Top As Long 
   Right As Long 
   Bottom As Long 
  End Type 
   
  Public Const SWP_NOZORDER=&H4 
  Public Const SWP_NOACTIVATE=&H10 
  Public Const SWP_SHOWWINDOW=&H40 
   
  Public Const WM_CLOSE=&H10 
   
  Declare Function GetClientRect Lib “user32” (ByVal hwnd As Long, lpRect As RECT) As Long 
  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 SetParent Lib “user32” (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long 
  Public Declare Function GetWindowLong Lib “user32” Alias “GetWindowLongA” (ByVal hwnd As Long, ByVal nIndex As Long) As Long 
  Public 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 ShowCursor Lib “user32” (ByVal bShow As Long) As Long 
   
  Mod_Main: 
   
  Option Explicit 
   
  Sub Main() '程序运行入口 
  Dim ClassName As String * 64 ’存放窗口的类名 
  Dim ExeCmd As String '存放命令行参数 
   
  GetClassName Frm_Setup.hwnd, ClassName, 64 ’取得窗口的类名 
  ExeCmd=UCase(Command$) ’将调用的屏保的参数转换成大写后存放在变量ExeCmd里 
  If Not (InStr(ExeCmd,“/P”)=0)Then ’检查屏保的调用参数中是否有“/P”参数 
  If Not (FindWindow(ClassName, WM_LOOK)=0)Then End ’如果找到已有同一个运行方式的实例存在则程序结束 
  ClosePreWindow ClassName, WM_SET ’关闭前面已启动的其他运行方式的实例 
  ClosePreWindow ClassName, WM_RUN ’同上 
   SCR_Look 
  ElseIf Not (InStr(ExeCmd,“/S”)=0)Then 
   If Not (FindWindow(ClassName,WM_RUN)=0) Then End 
   ClosePreWindow ClassName, WM_LOOK ’同上 
   ClosePreWindow ClassName, WM_SET ’同上 
   Scr_Run 
  Else 
   If Not (FindWindow(ClassName, WM_SET)=0) Then End 
   ClosePreWindow ClassName, WM_LOOK ’同上 
   ClosePreWindow ClassName, WM_RUN ’同上 
   Scr_Setup 
  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, WM_CLOSE, 0, 0) ’如果窗口已找到则关闭它 
  End Sub 
   
  Public Sub SCR_Look() 
  Dim LookScrWnd As Long 
  Dim Style As Long 
  Dim LookRect As RECT 
   
  Frm_Run.Caption=WM_LOOK ’赋上具有相应运行方式的标题 
   
  LookScrWnd=Val(Right(Command$, Len(Command$) - 2)) ’取得小屏幕的窗口句柄 
  Style=GetWindowLong(Frm_Run.hwnd, GWL_STYLE) ’取得窗口的样式 
  Style=Style Or WS_CHILD ’在窗口的样式中加入子窗体常数 
  SetWindowLong Frm_Run.hwnd, GWL_STYLE, Style ’改变窗体的样式 
  SetParent Frm_Run.hwnd, LookScrWnd ’设置窗体的父窗体 
  GetClientRect LookScrWnd, LookRect ’取得小屏幕的大小 
  SetWindowPos Frm_Run.hwnd, HWND_TOP, 0, 0, LookRect.Right, LookRect.Bottom, SWP_ 
  NOZORDER Or SWP_NOACTIVATE Or SWP_SHOWWINDOW 
  '显示窗体并将窗体的大小设置为小屏幕的大小以便覆盖小屏幕 
  End Sub 
   
  Public Sub Scr_Setup() 
  Frm_Run.Caption=WM_SET ’赋上具有相应运行方式的标题 
  Frm_Setup.Show 
  End Sub 
   
  Public Sub Scr_Run() 
  Frm_Run.Caption = WM_RUN ’赋上具有相应运行方式的标题 
  ShowCursor False ’隐藏鼠标 
  Frm_Run.Move 0, 0, Screen.Width, Screen.Height 
  Frm_Run.Show 
  End Sub 
   
  Public Sub CloseSCR() 
  ShowCursor True ’显示鼠标 
  Unload Frm_Setup ’卸载窗体关闭屏保 
  Unload Frm_Run ’同上 
  End Sub 
   
  Public Function Scan_RUN() As Boolean’侦测当前屏保的运行方式 
  If (Frm_Run.Caption = WM_RUN) Then ’如果屏保是以运行方式在运行则返回“真”,否则返回“假” 
   Scan_RUN=True 
  Else 
   Scan_RUN=False 
  End If 
  End Function 
   
  Frm_Run: 
   
  Option Explicit 
  Dim i As Integer ’定义循环变量 
  Dim OldX As Integer ’定义存放旧的鼠标水平坐标 
  Dim OldY As Integer ’定义存放旧的鼠标垂直坐标 
  Dim Pic(1) As New StdPicture ’定义一个图片类的数组 
   
  Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 
  If Mod_Main.Scan_RUN Then ’如果此时是在运行屏保则关闭屏保 
   Mod_Main.CloseSCR 
  End If 
  End Sub 
   
  Private Sub Form_Load() 
  i=1 ’为循环变量赋初值 
  OldX=-1 ’为旧鼠标水平坐标赋初值 
  OldY=-1 ’为旧鼠标垂直坐标赋初值 
  Set Pic(0)=LoadPicture(请写入图片一的路径和名称) ’读取图片一 
  Set Pic(1)=LoadPicture(请写入图片二的路径和名称) ’读取图片二 
  End Sub 
   
  Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y A 
  s Single) 
  If Mod_Main.Scan_RUN Then ’如果此时是在运行屏保则关闭屏保 
   Mod_Main.CloseSCR 
  End If 
  End Sub 
   
  Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
  If Mod_Main.Scan_RUN Then 
   If (OldX=-1) And (OldY=-1) Then 
   OldX=X 
   OldY=Y 
   Else 
   If (ScaleX(Abs(X-OldX),vbTwips,vbPixels)>= 3) Then 
   Mod_Main.CloseSCR ’将鼠标当前的水平坐标和垂直坐标与旧鼠标的水平坐标和垂直坐标相减其绝对值如果大于3个像素则退出屏保 
   End If 
   End If 
  End If 
  End Sub 
   
  Private Sub Form_Unload(Cancel As Integer) 
  Mod_Main.CloseSCR ’关闭屏保 
  End Sub 
   
  Private Sub Timer_Mov_Timer() 
  If (i>=2) Then 
   i=1 ’如果循环变量大于图片的数量则变量赋为1 
  Else 
   i=i+1 ’否则循环变量加一 
  End If 
  Frm_Run.PaintPicture Pic(i-1),0,0,Width,Height,0,0,ScaleX(Pic(i-1).Width,vbHimetric,vbTwips),ScaleY(Pic(i-1).Height,vbHimetric,vbTwips)’在Frm_Run上画图 
  End Sub 
   
  Frm_Setup: 
   
  Option Explicit 
   
  Private Sub Com_OK_Click() 
  Mod_Main.CloseSCR 
  End Sub 
   
  Private Sub Form_Unload(Cancel As Integer) 
  Mod_Main.CloseSCR 
  End Sub 
  好了,一个标准的屏幕保护程序就编写好了。按下F5运行试试看。不要忘了生成EXE文件时一定要将屏保的扩展名改为SCR并将其拷贝到Windows的System目录里才可在屏保设置中见到喔!(程序在VB 5.0中编写并运行通过。)如果你对此还有什么问题的话可到我的主页(http://kennyok.163.net)或是发Email给我(lucykenny@163.net)。

展开阅读全文
  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
2—1 VB6.0的集成开发环境   Visual Basic,简称VB,是当今世界上应用最广泛的编程语言之一,它也被公认为是编程效率最高的一种编程方法。无论是开发功能强大、性能可靠的商务软件,还是编写能处理实际问题的实用小程序VB都是最快速、最简便的方法。 在学习可视化编程语言时,通常都是从编写最简单的程序开始的,它让初学者可以体验一下到底是如何使用强大的集成开发环境编写程序的。 由“开始”,移到“Microsoft Visual Basic 6.0中文版”,再移到“Microsoft Visual Basic 6.0中文版”上,单击鼠标左键,就出现“新建工程”的对话框。   首先,让我们先启动Visual Basic 6.0。弹出“新建工程”对话框,我们选择“标准 EXE” 。单击“打开”。   这时候看到的是VB集成式开发环境,让我们先对它进行一番了解。   ·左面是VB的工具箱,    里面的各种图标是我们开发程序时经常用到的标准控件。   ·正中间是窗体编辑器,又称对象窗口。    我们程序的界面,大部分是在它上面设计的。   ·右上方是工程资源管理器,    它能让我们对整个工程进行整体性的管理。   ·右中处的是属性窗口,    陈列着程序中所涉及的各种窗体和控件的属性。   ·右下方是窗体布局区,    它能够调节程序运行时窗体在屏幕中的位置。 窗体的最上层是“VB 6.0的菜单”和“便捷工具按钮”,菜单中包含了所有的VB提供的功能的选项,而其中一些常用的功能或操作选项则被提取出来放在了“便捷工具按钮”中,通过点击这些快捷按钮可以加快程序开发的速度,下图标出了常见的工具按钮的作用。 Visual Basic采用集成开发环境,强大的集成开发环境使你几乎不用编写任何代码即可编写出完整的Windows程序来。这使我们编写windows下的应用程序变得简单起来。 启动Visual Basic 6.0后,我们可以看到VB的集成式开发环境。 VB其实很多功能和其它一些常用软件的功能都十分相似,下面我们就对每一部份进行逐步讲解。 一、功能齐全的菜单栏 菜单栏中包含了Visual Basic几乎所有的命令,其菜单项分别如下: (1)“文件”菜单:打开和保存及关闭项目,也可用于生成可执行文件,以及过的工程项目列表。 (2)“编辑”菜单:用于撤消所做的操作,执行:“查找”、“复制”、“粘贴”等编辑命令。 (3)“视图”菜单:用于在对象、代码窗口之间的切换,显示与隐藏IDE构件等命令。 (4)“工程”菜单:用于对工程添加窗体、模块、引用其他Windows对象和工具框等命令。 (5)“格式”菜单:用于对窗体控件进行排版等操作。 (6)“调试”菜单:用于查错命令。 (7)“运行”菜单:用于运行程序、设置断点和中止当前应用程序等命令。 (8)“工具”菜单:用于启动菜单编辑器和配置环境选项命令,还包含建立ActiveX构件和ActiveX控件时所需要的命令。 (9)“插入”菜单:用于启动数据管理器和外接程序管理器的命令。 (10)“窗口”菜单:用于布局窗口的命令。 二、方便快捷的工具栏 工具栏中集成了一些常用的菜单命令,用于迅速启动常用的菜单命令。工具栏包含通常的标准工具栏,还包含了VisualBasic的专业工具栏。工具栏的设置可以通过“视图”菜单中的“工具栏”子菜单中的各菜单项来完成。通过改变“视图”菜单中的各个选项可以浏览其他工具栏。 三、可视化控件工具栏 控件工具栏也称为控件工具箱,其中包含了众多的控件。当用户进行可视化设计界面时,可以将这些控件放入窗体中发挥其各自特殊的功能。在缺省情况下,VB工具箱中封装20个常用的ActiveX控件。 控件工具栏中的控件及其名称,如下图所示。   要将控件放置在窗体中,具体方法如下: (1)在工具箱中选择要添加的控件(即单击该控件) (2) 将鼠标移到窗体之中,这时鼠标变成十字形状。 ; (3) 按下鼠标左键并拖住不放,在窗体上“画”一个大小适当的矩形出来。松开鼠标后,窗体上就会出现一个和刚才所画矩形一样大小的控件。 四、常见窗口介绍 属性窗口 属性窗口即控件的各种属性的窗口。 属性窗口可以用来显示控件的各种属性,我们可以通过属性窗口对控件的属性值进行修改。属性窗口可以分为左右两个部分,左边是属性的名称,右边则是属性的值。 在属性窗口中我们可以看到“按字母序”和“按分类序”两个标签,分别代表将属性进行字母排序和按类别排序。 另外,当选择了某个属性时,在属性窗口的下方将会出现对该属性的作用或意义的相关描述。 当我们要修改一个控件的属性值时,我们首先需要在窗体上选中所要修改的控件,属性窗口中的各属性将自动变为当前选中控件的属性,然后在属性窗口右边的部分修改相应属性的值。 例如:属性窗口的标题是“属性—Forml”,代表当前选中的对象是“Forml”窗体,(窗体同控件一样,也具有各种属性,并且我们同样可以通过属性窗口对其值进行修改。事实上, Visual Basic将窗体同样视为对象)在下面所看到的属性中有一项“Caption'’属性,这里Cap- tion属性值是程序启动后窗体标题栏所显示的文字。单击“Caption'’属性后面的编辑框,可以将“Forml”更改为其它文字。 工程管理器窗口 工程管理器用来管理开发一个VB程序所需要的各种类型的窗体和模块。 窗体是一个程序表现在外的界面、模块是程序内部使用的代码。当我们在“工程”菜单中单击“添加窗体”菜单后,“VB工程管理器”中就会显示出新添加的窗体。这也就是“VB工程管理器”的功能,它使我们从总体上把握程序开发的各个部分。并能通过双击“工程管理器”窗口中的某一部份将当前视图转到所选中的部份。 窗体布局窗口 窗体布局窗口的作用是用于控制程序启动后,各窗体位于屏幕中的相对位置。 将鼠标移动到窗体布局窗口上时,鼠标变成移动形状,这时拖动窗体可以改变程序启动时窗体位于屏幕中的位置。程序启动后“Forml”窗体位于屏幕上方中间位置,而“form1.frm”窗体则位于屏幕中间。 通过在窗体布局窗口中移动窗体所设置的位置在分辨率改变后就会发生错位的现象,也就是程序启动后窗体所在屏幕的位置并不是此时所设置的位置。通过右击窗体布局窗口在弹出菜单中选择“分辨率向导”命令,可以更加准确地设置程序启动后窗体位于屏幕中的位置。 窗体设计窗口 窗体设计窗口是用来设计窗体的。 在窗体设计窗口中我们可以为窗体添加各种控件,用以设计用户界面。双击工程管理器窗口中的某个窗体即打开该窗口。 代码编辑窗口 当我们在“窗体设计”区域中双击鼠标后就会弹出代码编辑窗口,也可以通过选择“视图”菜单中的“代码窗口”命令弹出代码编辑窗口以进行程序代码的编写。 在代码编辑窗口的左下角有两个按钮,其作用是设置查看代码的方式。第一个按钮表示按单个过程的方式查看代码,第二个按钮表示在窗口中显示该模块的所有过程。 可以看到一行行的Ⅷ程序代码显示在其中,我们在这里可以修改和输入程序代码来让程序实现一定的功能,它是整个程序设计的关键,如果你对VB语言的语法还不是十分了解,可以通过后面的章节来学习,很快就能人门的。 例如我们选择Form对象,这个列表框中陈放着本程序的所有对象,称为对象选择框。(见图三)右边列表框里放着每个对象的各个事件,称为事件选择框。当在左面的对象选择框选取Form时,事件选择框里的事件相应变为Load。同时空白处出现了两行代码,它们分别表示子程序 Form_Load 的首尾两部分,而 Form_Load 则是当窗体从无到有,即刚调入内存时,所执行的一个子程序。 五 保存与编译 单击文件,再单击保存工程。 “工程1.vbp”的项目文件。单击保存。 另一个是名叫“Form1.frm”的窗体文件。一个VB程序至少包含这两个文件,即项目文件.vbp 和窗体文件.frm,缺一不可。   最后,将它编译成可执行文件。编译的作用是将你编的程序代码翻译成计算机能执行的语言,这样程序就不光是在VB6.0环境中运行了。   单击文件,单击生成工程1.exe。单击确定。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值