说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

设计简单的屏幕保护程序 -VB资料

HTML文档下载 WORD文档下载 PDF文档下载
设计简单的屏幕保护程序 -VB资料
作者:李波涛

利用VB5.0设计屏幕保护程序

  实际上使用Visual Basic 5.0很容易建立屏幕保护程序。任何Visual Basic应用程序都可以作为一个屏幕保护程序来运行,只是有的程序做此工作会比其它程序更好一些。要想使自己的应用程序扮演Windows环境中屏幕保护程序的角色,需要将该程序作为一个屏幕保护程序来编译。

  具体操作:从File菜单上选定Make EXE File,在Make EXE File对话框中作以下改动:不再建立带扩展名为EXE的可执行文件,而是把扩展名改为SCR。

  下面具体探讨了如何利用Visual Basic 5.0设计屏幕保护程序,也就是在设计屏幕保护程序时应注意的几个问题:

1、 如何防止同时运行屏幕保护程序的两个实例

  Visual Basic 提供了一个App 对象,它有一个PreInstance 属性,如果当前Visual Basic应用程序的一个实例已经运行时,便把该属性设置为True,从而避免同时运行一个屏幕保护程序的多个实例。
  下面的代码展示App.PreInstance 是如何典型地在一个屏幕保护程序中实现的。

  If App.PreInstance=True then
    Unload Me
  Exit Sub
   End If

  此外,还有一种更好的方法可以避免同时运行一个屏幕保护程序的多个实例。使用一个通知操作系统已经有一个屏幕保护程序被激活的Windows 95 API函数。这个函数便是SystemParametersInfo,其声明如下:

Private 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

  在窗体加载事件的开始调用一次这个函数并在窗体卸载事件期间再调用一次。这两个调用必须成对出现并且二者必须在屏幕保护程序的执行期间进行调用。

  以下是在窗体加载事件中对该函数的调用: x=SystemParametersInfo(17,0,ByVal 0&,0)
  以下是在窗体卸载事件中对该函数的调用: x=SystemParametersInfo(17,1,ByVal 0&,0)

2、如何在屏幕保护程序中隐藏鼠标光标

  ShowCursor API 函数允许在Visual Basic 应用程序中隐藏或显示鼠标光标,Windows 通过更改它所维护的一个变量中的计数跟踪鼠标光标的可视性, 每次用参数值True调用ShowCursor 都使这个计数递增,每次用参数值False调用ShowCursor都使这个计数递减,如果该计数为0 或者更小, 鼠标光标自动隐藏起来。 以下是ShowCursor API函数的声明:

Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long

  下面是两个使用ShowCursor 函数的例子。

  显示鼠标光标:
   Private Sub ShowMouse()
    While ShowCursor(True)<=0
    Wend
   End Sub

  隐藏鼠标光标:
   Private Sub HideMouse()
    While ShowCursor(False)>0
    Wend
   End Sub

3、如何检测鼠标的移动

  MouseMove事件用来检测鼠标的移动,当应用程序启动时甚至鼠标实际上并未移动的情况下,MouseMove 事件都会触发一次。所以第一次触发MouseMove事件时,只是记录鼠标当前位置,仅当鼠标真正从其起始位置移开时,才终止屏幕保护程序。具体实现代码如下:

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
 Static XLast, YLast As Single
 Dim XNow, YNow As Single
 
  '记录当前位置
   XNow = X
   YNow = Y
  
  '第一次触发MouseMove 事件, 记录当前位置
   If XLast = 0 And YLast = 0 Then
    XLast = XNow
    YLast = YNow
    Exit Sub
   End If
  
  '仅当鼠标移动足够迅速( 一次2个像素以上)才恢复屏幕
   If Abs(XNow - XLast) > 2 Or Abs(YNow - YLast) > 2 Then
    QuitFlag = True
   End If
End Sub

4、如何检测鼠标单击

  Form_Click事件用来检测鼠标单击,Form_Click事件的具体代码如下:

   Private Sub Form_Click()
    '鼠标单击,结束屏幕保护程序
    QuitFlag=True
   End Sub

5、 如何检测键盘的活动

  Form_KeyDown 事件用来检测键盘的活动,当按下任何一个键(包括换档键)时,都能结束屏幕保护程序。Form_KeyDown 事件的具体代码如下:

   Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    '按下键盘,结束屏幕保护程序
    QuitFlag = True
   End Sub

6、 设置几个重要属性
  Form 窗体BorderStyle 为0-None,ControlBox 为False,KeyPreview 为True,MaxButton 和MinButton 为False,WindowState 为2-Maximized,定义窗体级变量QuitFlag(Dim QuitFlag as Boolean)。
  Timer控件(在Form窗体中)Enabled 属性在设计环境中设置为False。

  下面有一个完整的屏幕保护程序实例,其演示效果为:把当前的显示复制到一个全屏幕的窗体中,然后随机在屏幕上画一些实心彩色小圆,并随机显示彩色字样"Baby,I loveyou!"。 同时, 在屏幕底部有一移动的图片框,可以在设计环境中添加自己喜欢的图片,例如可设计为:程序设计:李波涛。在本屏幕保护程序中,设置Timer 控件的Name属性为tmrExitNotify; 另外,在窗体底部添加一个PictureBox控件,设置其Name属性为picture1。

  在调试本程序时,有一技巧值得说明的是:可将Form_Load 事件中Select Case …End Select语句稍作修改如下:
  a、将Case "/S" 注释掉, 在其下添加Case Else 语句;
  b、将Case Else/Unload Me/Exit Sub 三条语句注释掉;

  这样,可在VB5.0 环境下,调试本程序,预览演示效果。在调试完成后,再将上述修改恢复原样,编译成后缀为SCR的文件。

Option Explicit

'Declare API to inform system whether screen saver is active
Private 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 API to hide or show mouse pointer
Private Declare Function ShowCursor Lib "user32" ( _
  ByVal bShow As Long _
) As Long

'Declare API to get a copy of entire screen
Private Declare Function BitBlt Lib "gdi32" ( _
  ByVal hDestDC As Long, _
  ByVal X As Long, _
  ByVal Y As Long, _
  ByVal nWidth As Long, _
  ByVal nHeight As Long, _
  ByVal hSrcDc As Long, _
  ByVal xSrc As Long, _
  ByVal ySrc As Long, _
  ByVal dwRop As Long _
) As Long
  
'Declare API to get handle to screen
Private Declare Function GetDesktopWindow Lib "user32" () As Long
'Declare API to convert handle to device context
Private Declare Function GetDC Lib "user32" ( _
  ByVal hwnd As Long _
) As Long

'Declare API to release device context
Private Declare Function ReleaseDC Lib "user32" ( _
  ByVal hwnd As Long, _
  ByVal hdc As Long _
) As Long

'Define constants
Const SPI_SETSCREENSAVEACTIVE = 17

'Define form-level variables
Dim QuitFlag As Boolean

Private Sub Form_Click()
  'Quit if mouse is clicked
  QuitFlag = True
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  'Quit if keyboard is clicked
  QuitFlag = True
End Sub

Private Sub Form_Load()
  Dim X As Long, Y As Long
  Dim XScr As Long, YScr As Long
  Dim dwRop As Long, hwndSrc As Long, hSrcDc As Long
  Dim Res As Long
  Dim Count As Integer
   
  'Tell system that application is active now
  X = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, ByVal 0&, 0)
  'Hide mouse pointer
  X = ShowCursor(False)
  
  'Proceed based on command line
  Select Case UCase(Left(Command, 2))
  
  'Put the show on the load
  Case "/S"
    Randomize
    'Copy entire desktop screen into picture box
    Move 0, 0, Screen.Width + 1, Screen.Height + 1
  
    dwRop = &HCC0020
    hwndSrc = GetDesktopWindow()
    hSrcDc = GetDC(hwndSrc)
    Res = BitBlt(hdc, 0, 0, ScaleWidth, ScaleHeight, hSrcDc, 0, 0, dwRop)
    Res = ReleaseDC(hwndSrc, hSrcDc)
    
    'Display full size
    Show
    
    Form1.AutoRedraw = False
    'Graphics loop
    Do
      Count = 0
      X = Form1.ScaleWidth * Rnd
      Y = Form1.ScaleHeight * Rnd
      
      Do
        X = Form1.ScaleWidth * Rnd
        Y = Form1.ScaleHeight * Rnd
        
        DoEvents
        
        Form1.FillColor = QBColor(Int(Rnd * 15) + 1)
        Circle (X, Y), Rnd * 80, Form1.FillColor
        Count = Count + 1
               
        'Exit this loop only to quit screen saver
        If QuitFlag = True Then Exit Do
        
        'Move picture
        Dim Right As Boolean
        If Picture1.Left > 10 And Not Right Then
          Picture1.Left = Picture1.Left - 10
        Else
          Right = True
          If Picture1.Left < 7320 Then
            Picture1.Left = Picture1.Left + 10
          Else
            Right = False
          End If
        End If
        If (Count Mod 100) = 0 Then
          Form1.ForeColor = QBColor(Int(Rnd * 15) + 1)
          Print "Baby, I love you!"
        End If
        
      Loop Until Count > 500
      Form1.Cls
      
    Loop Until QuitFlag = True
  
    tmrExitNotify.Enabled = True
  Case Else
    Unload Me
    Exit Sub
  End Select
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
  Static XLast, YLast As Single
  Dim XNow, YNow As Single
  
  'Get current position
  XNow = X
  YNow = Y
  
  'On first move, simply record position
  If XLast = 0 And YLast = 0 Then
    XLast = XNow
    YLast = YNow
    Exit Sub
  End If
  
  'Quit only if mouse actually changes position
  If Abs(XNow - XLast) > 2 Or Abs(YNow - YLast) > 2 Then
    QuitFlag = True
  End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
  Dim X
  
  'Inform system that screen saver is now inactive
  X = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, ByVal 0&, 0)
    
  'Show mouse pointer
  X = ShowCursor(True)
End Sub

Private Sub tmrExitNotify_Timer()
  'Time to quit
  Unload Me
End Sub
计算两个日期间的工作日-VB资料 监视外部程序的运行情况-VB资料 检测文件是否存在 -VB资料 检测系统驱动器-VB资料 检查电子邮件地址输入的有效性 -VB资料 检查硬盘空间 -VB资料 将数据转换为内存二进制形式字符串(模拟CV?和MK?$两组函数) -VB资料 禁用 Alt-Tab 或 Ctrl-Alt-Del -VB资料 禁止使用 Alt+F4 关闭窗口-VB资料 绝非玩笑:VB7将完全面向对象 拷贝磁盘 -VB资料 控制Ctrl+Del+Alt键-VB资料 快速编辑VB程序技巧 快速查找或替换文本中的字符-VB资料 快速建立目录 -VB资料 快速交换整数 -VB资料 快速注册/注销动态链接库或控件-VB资料 理解面向对象编程 -VB资料 VB利用GetCursorPos 读取滑鼠的座标 利用Visual Basic 关闭Windows9X或者Windows NT VB利用代码启动/关闭中文输入法 模拟一次鼠标事件 -VB资料 目前执行的是哪一国语言的 Windows -VB资料 VB判断剪贴板的所有可用格式 VB判断驱动器类型 VB判断是否已经建立 Dial Up 连接 VB判断一个年份是否为闰年 VB判断一个驱动器的类型 屏蔽文本框默认的右键菜单——浅谈如何控制Windows消息 -VB资料 奇数和偶数校验-VB资料 启动控制面板命令大全 -VB资料 windows2000进入“等待”后,唤不醒是怎么回事,请指点! jsp数据库中的Date类型? 在vb中如何进行时间比较?例如1 / 7 / 17 10:00:00 - 1 / 7 / 17 00:00:00 得到一个值?? 请问如何获得其他机器的网卡MAC地址?非常感谢!!! 别了,最爱的BCB! 如何判断一个指向窗口的指针可用? 请教高手:怎么样破windows2000的登陆密码?其密文存放在什么地方? 急:哪里有电子文档 找到找到 网络编程、大虾有请!如何获得当前每秒的字节数? 各位高手,有人喜欢用mysql吗?谈谈这个东东吧 大富翁怎么连不上了? 各位武汉的大虾,请教武汉程序员、高级程序员、系统管理员(正规的大公司)、以及用JAVA做开发的工资一般为多少。希望大家给予帮助!!前途问题!! 网络编程大虾有请!如何获得当前每秒的字节数? 怎样在treeview中设置背景图片 to 版主:精华区太乱了,请给予分类。谢了 听说VB可以写PAD的程序,TRUE? JLabel中文本换行问题 马上要开始学BCB,请问BCB有那种类似于VC的创建类的向导吗,看到BCB的界面我就想到DELPHI中创建类的难度 我的游戏引擎BATTLEFIELD作好了,欢迎下载(这次是真的) 一个pop_up menu的问题 那位高手知道在SDK中使用ADO的方法 为普天之下正直而上进的程序员找一个温馨的家 为什么不能把JMF包打进去??? 内存泄露是指例如“为对象分配一个内存区后,未删除内存区,但删除了对象”是吗? 装pws时遇到的麻烦! to freezwy(网络自由人) 有没有限制上传图片大小的asp代码??(不是组件) 还是没有解决!!! 有关VC中数据库绑定的问题! 扔个骨头……下个“圈套”,呵呵? ^_^ 紧急情况!如何改变DataGrid控件中个别行的颜色?? 如果实现断开共享目录的连接 acces 表 SQL语句中如何转换字符型字段为整型? First-chance exception 请教directx的一个入门问题? 诚征MM中…… 多线程问题?? 请问sybase中real类型的最大值是多少?999999999 自杀的N个理由 如何根据日期计算出一年中的第几天? 情况不对,撤丫~~~~~~~~~ 如何在JBuilder4.0编译环境下打包\编译??????? 关于对话框的一个简单问题 如何把几个chm(已编译的 html 文件)文件合成一个chm文件 ado参数问题 请问sevrlet怎么结合HTML模板工作呢?谢谢 我想作一些动态界面,有谁能提供一些有关这方面的资料.小弟有礼了 比较弱的问题 各位大哥:请问哪儿有通过ADO操纵数据库的完整程序下载呀。最好是比较精典一点。谢 写一个php中的include文件,后缀名应该是什么。马上给分 怎么将PHOTOSHOP中分割的图片的结构植入DW4中? 一项工程,甲工程队单独做40天可以完成,乙工程队单独做80天可以完成,现由甲先单独做10天,然后与乙共同完 一项工程,甲独做需10天,乙独做需15天,如果两人合作,甲的工作效率就要降低,只能完成原来的4/5,乙只能完成原来的9/10,现在要8天完成这项工程,两人合作天数尽可能少,那么两人要合作多少天?要 某项工程队,甲单独做需a天完成,在甲做c天(c 一项工程甲队单独做要10天完成乙队单独做要12天完成现在两队合做4天剩下的由乙队单独完成需要多少天?有助于回答者给出准确的答案 一项工程,甲队单独完成要10天,乙队单独完成需要15天,甲队和乙队的工作效率比是多少 一项工程,甲单独完成需要a 天,甲,乙合作需要b 天完成,求乙每天完成多少? 一项工程甲单独做要10天完成,乙单独做15天完成.现在甲做4天,乙做3天,分别完成这项工程的几分之几? 一项工程甲单独做要10天,乙单独做要15天,如果两人合作,甲的工作效率要降低20%,乙的工作效率要降低10%,现在要8天完成这项任务,两人合作的天数尽可能少,那么两人要合作多少天? 一项工程,甲单独完成需要a天,甲,乙合作需要b天,求乙每天完成多少? 一项工程,甲独做10天完成,乙独做15天完成,现在甲做4天,乙做3天,分别完成这项工程的几分之几? 一项工程,甲单独做需10天,乙独做需15天,如果两人合作,甲的工作效率就要降低,只能完成原来的4/5,乙只能完成原来的9/10,现在要8天完成这项工程,两人合作的天数尽可能少,那么两人合作要多少 一项工程,甲队独坐a天完成,乙队独坐b天完成.两队合作,求完成的天数 做一项工作,甲用5天完成,乙用4天完成,甲每天可完成这项工作的几分只几?乙每天可完成这项工作的几分只 一项工程由甲乙丙三个工程队单独做,甲队要6天,乙队要7天,丙队要14天,合作一天后还剩几分之几?是1-(6\1+7\1+14\1)嘛~ 一项工程,甲队独做A天完成,乙队独做B天完成.两队合作( ),天数完成 单独完成一项工程,甲要5天,乙要8天,甲的工作效率是乙的几分之几? 甲乙两个工程队合做一件工程,7天能完成,两队先合做5天后甲乙两个工程合作一件事情,7天能完成,两队先合作5天后,甲工程队的全部人员和乙工程队人员的1 /5,调到 0 | 解决时间:2010-8-30 18:31 | 一项工程,甲单独做需A天完成,乙单独做需B天完成,两人合作比甲单独做提前完成的天数为( )A.ab/a+b B.b的平方/a+b C.a的平方/a+b D.a-b/a+b 做一项工程,甲用5天可以完成,乙用4天可以完成,甲每天可以完成这项工作的几分之几?乙每天可以完成这项工作的几分之几?乙的效率比甲高百分之几? 一项工程,甲乙两人合做18天完成,甲单独做要30天,现甲乙两人先做六天,再由甲做10天,这件工程还剩几分之几 一工程 甲单独做3天完成,乙单独4天完成,甲队工作效率比乙队大约快( ) A,25% B 、25.1% C,30% D,3.3% 一件工作 ,甲单独做15天完成,乙单独做12完成.两个合做4天可以完成这项工作的几分之几? 一件工程,甲乙合做18天完成,甲单独要30天完成,现在两人合做6天后,再由甲单独做10天,工程还剩几分之几? 某工程甲乙两人合作8天完成,需要费用3520元,若甲单独做6天后,剩下的工程由已来做,已还需12天完成,这这样共需要费用3480元.(1)甲乙两人单独完成此项任务需要多少天?(2)甲乙两人单独完 甲 乙两人合干一项工作,原计划12小时完成,现在甲先干了5小时,甲,乙又合干了10小时才完成.求乙的工作效率是假的几分之几 一件工程甲乙合作8天完成甲单独做30天完成现在甲乙合作4天后再由甲独做10天一共完成这项工程的几分之几?解答并且讲题 一项工程,甲乙两人合作4天后,再由甲独做6天才完成.已知甲比乙每天多完成1/80,则甲乙单独完成各需多少 一件工作 甲单独做需要10小时完工,乙单独干需15小时完工,现甲乙合干几小时完工? 一项工程甲独做6天完成,乙独做8天完成,那么甲乙合作一天完成这项工程的几分之几?甲做a天,乙做b天,共完成了这项工程的几分之几? 一项工程,甲,乙两人合作10天可以完成,或甲独做20天可以完成.现甲,乙两人共同做6天后离开,甲离开,由乙单独完成这项工程,乙还需要多少天? 一项工程,甲乙合干10小时完成,家单独干18小时完成,乙单独干1小时能完成这项工程的几分之几? 一项工程,甲、乙合作6天完成.甲单独做11天完成,乙单独做每天完成这项工程的几分之几? 一项工程,甲、乙两人合作4天后,再由甲单独做6天才完成全部任务,已知甲比乙每天多完成这项工程的80分之1,则甲、乙单独完成各需多少天? 一件工作,甲单独完成要10小时,乙单独完成要11小时,甲和乙个做了7小时,甲完成了这件工作的几分之几?乙完成了这件工作的几分之几?哪个做得快些? 一项工程,甲工程队单独做要10天完成,乙工程队单独做6天完成,现甲工程队先做2天,乙工程队再加入合作,完成这A、B两地城际高速铁路预计在2012年5月1日正式运营,按设计要求,两地单程直达 一项工程甲单独做6天完成,乙单独做10天完成,甲独做1天后,甲、乙两人合作,又做了x天完成这项工程的6/5.根据题意列出方程:_________. 一项工程,甲单独做8天完成,乙单独做6天完成,两队合作3天后还剩这项工程的几分之几?怎么列式? "每年人均食品支出占人均支出的几分之几?",是人均支出分之人均食品支出吗 甲乙工程队合做,10天可以完成,如果甲队做4天,乙队做6天,共完成这项工程的15分之7,求甲独做要几天?要算术法 一项工程,甲独做8天完成,独做12天完成.两队合作3天后,还剩几分之几? ①的三角形的面积是②面积的几分之几,帮忙把式子也列出来,把原因也说说 已知一项工程由甲、乙两工程队单独完成,分别需要6天,10天,如果甲、乙共完成这项工程,且各做了整数天,那么怎样派工才能使完成这项工作的总工期最短?最短工期是几天? 一项工程,由甲队修建要30天完成,由乙对修建要20天完成,两队同时修建8天后,还剩这项工程的几分之几?算式 数学题给下算式不要分部 70人相当于80人的几分之几 一项工程,甲乙两个工程队合作6天可以完工现在甲先做4天乙又接着做8天正好完工以每天完成这项工程的几分之几分之几?我给少了一个字大家快来回答 已知一项工程,由甲队单独做30天完成,由乙队单独做20天完成.两队合作10天,还剩下工程的几分之几 修一条路,甲队单独修要15天,乙队单独修要12天,两队合修6天,两队各修完这条路的几分之几? 一项工程,甲单独做要10天完成,乙单独做要15天完成,现在甲乙合作4天,还剩下工程的几分之几 一项工程,由甲队做30天完成,由乙队做20天完成.两队合作五天可以完成工程的几分之几? 一项工程 甲队单独做6天完成,乙队独做15天完成,两队合作,一天完成这项工程的几分之几? 甲乙两个工程队同修一条路,同时施工,甲每天修a米,乙每天修b米,8天修完,这条公路长多少米? 一项工程甲单队独做要20天完成乙队单独做要15天完成两队合作5天后还剩几分之几没修 一项工程,甲单独完成要10天,乙单独完成要15天两人各做3天,一共完成这项工程的几分之几 甲工程队单独做40天完成,乙独做30天后,甲乙合作20天完成.将工程分成两部分,甲用A天,乙用B天.A、B均为正整数,A〈15、B〈70.求A、B? 一项工程,甲工程队单独做要12天完成,乙工程队单独做要10天完成,现在两个工程队合作做了4天,共完成这项... 一项工程,甲队单独做需要18天,乙独做15天完成,现决定由甲、乙二人共同完成,但中途甲有事请假四天,那么完成任务时甲实际做了多少天?请说说思路,感激! 甲乙两个工程队同修一条公路,他们从两端同时施工.甲每天修a米,乙每天修b米,8天修完,问这条路长多少米问这条路长多少米(要算出准确答案) 一项工程,甲工程队单独做40天完成,乙工程队单独做60天可以完成,现在由甲单独做10天,然后与乙共同完成余下的工程,甲工程队共做多少天?(列方程解答) 一项工程,甲队独做15天完成.现在甲队单独做啦几天,再由乙对单独做,过共用拉11天完成,那么5天能完成吗 甲,乙两个工程队共同完成A和B两个项目.已知甲从单独完成A项目需3天,单独完成B项目需7天;乙队单独完成A项目需11天,单独完成B项目需9天.如果两队合作用最短的时间完成两个项目,则最后一天
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn