浅显基础教程
电脑操作教程
电脑怎样拨号上网
怎么做个人网页
怎样做局域网
Word教程(文字处理)
图形图象处理入门
经典进步教程
怎样运用代理服务器
怎么做无盘工作站
Photoshop教程
Dreamweaver3教程
Flash4&5教程
Firework3教程
Frontpage2000教程
Authware教程
Office2000教程
怎么制造动画图片
OICQ&ICQ运用办法

高手学习攻略

硬件晋级技巧
CGI教程
ASP教程

PHP教程

注册表运用技巧
路由器的设置
vwin建造攻略
SQL
最近更新:
VB
相关内容

运用VB编写屏幕维护程序
刘明 (06/28/1999)


    了解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)

用VB完成多文件查找与替换功用
用VB 5.0 规划Browser及FTP程序
用Visual Basic 5.0规划E-mail程序
谈谈WIN API在VB中的运用
vwin :首页 在VB中运用Word的“艺术字”东西
获取Win95特别目录精确途径
配置文件.ini在VB5中的运用
操控结构VB5程序规划
用VB切换三个特别键
用VB5对Windows 95任务栏提示区编程
用API改善ListView显现作用
VB中Grid控件的打印办法
在VB中完成文件上载
用Microsoft Agent 控件与电脑攀谈
用VB5直接操控Excel 97
在Developer/2000中调用VB
在VB顶用API完成多媒体
VB6制造Win98风格的东西栏
VB6六问答
运用VB编写屏幕维护程序
 
 
 
 
 
 
上一页
下一页
 
教程站
收集整理