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

设计简单的屏幕保护程序 -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
Android中内嵌字体实现个性化 TextView多行本文滚动轻松实现 获取和设置ListView的选择项 EditText中显示隐藏Android输入法窗口 自定义ListView行间的分割线 Android程序完全退出的三种方法 WebView使用技巧和介绍 EditText仅允许特定类型数据输入 自定义Android应用的访问权限 android.text.format文件大小和日期解析类 Android Rootkit相关揭秘 androidmanifest.xml高级属性解析 根据packageName构造Context SQLite操作,还是raw方法更简洁高效 Android开发基础YesNo对话框构造代码 Android代码性能优化技巧 Android开发注意点 Part One onSaveInstanceState和onRestoreInstanceState的用处 Android基础概念Context的作用 在Android的Notification中显示进度条 Android跨进程数据通讯-剪切板Clipboard ConditionVariable Android线程同步 Android软件开发方向指导 ArrayList LinkedList Set HashMap介绍 PermissionInfo Android权限枚举方法 Android上HTTP协议通讯状态获取 Android开发需要自己完善的类库总结 Android的ListView控件滚动时背景问题 GestureDetector手势识别类 - 进阶篇 MenuInflater Android菜单从xml创建方法 EditText输入提示你知道吗? 并口控制? 怎样用java 开发web service?请各位高手发表意见 SOS !!!在树型控件中怎样获得子树的内容!!!??? JAVABEAN与应用程序 当我准备在一个项目构造很多Class时,Class的分类可以通过放在嵌套名字空间中实现,或者通过多级的子Class来实现,两种方法有什么不同。 有什么办法知道一个新建的域用户是第一次登录到域中 请问在DB2里怎样取出一段VarChar型字段的长度? 局域网共享ISDN,IP的设定问题。 有什么办法知道一个新建的域用户是第一次登录到域中 如何用TC使编译后的文件为LIB? 烦!为什么我今天(以前挺正常的)发任何贴子,贴子里无论是什么内容都会出错:“无法显示 XML 页。。。”希望管理人员把解决的方法mail 那些软件可以查看可执行文件使用了哪些API? 眼睛瞎掉才能够活的更好? 急需asp语音聊天室源码!!! 用openssl生成多级CA证书有特殊的要求么? 帮忙,谁有CGI计数器源程序代码? 请问怎样把Tcaption类型转化为Pchar类型? java的网络编程 有谁知道RootNode的函数原型??? 哪里有中文版的delphi帮助或手册??? 比市场价低3000的全新的 康柏 2710 CWnd很少用,有些地方弄不明白。 我的Flash做了一个banner468*60,可是,放在网页上之后,超出了这个范围之内显示,怎么办,那样会很难看的???哪位能帮帮我呀?? 怎么样捕捉SQL-Server的错误 请解释:VC6环境的自动完成功能在什么情况下会不起作用??? 请问Delphi的控件只有bpl、dcu、res、frm,在BCB中怎么使用?谢谢! 怎么把數據寫入.dbf中!!!!!!!!!!!!! 为什么不能在WIN2K下运行?? help!! 哪位高能告诉我怎么做? 头文件怎么写? 有人知道split函数的详细用法吗,各个参数的意义? 真的有所谓的第四种情感吗????? 请问怎样在HTML的编程环境下,能直接读取到JPG和GIF图片文件的高度和宽度(用pixel表示)? 有没有与msxml4.0有关的基础性的文章? ---> 服务器端和客户端软件同时写一个数据项产生冲突,如何解决???急急急 <--- 为什么我的函数声明编译出错 com中如何创建非可视组件实例 有关程序员考试的问题,请大家帮帮忙!!谢谢! session 问题 如何实现文件夹共享 如何用系统监视器查看远程的计算机的系统运行情况? 为什么这段代码不行啊?? 上INTERNET时,如何得到本机拔号IP地址? 多进程使用单值信号量协调,设置 SEM_UNDO, 执行semop 时返回 errno = ENOSPC,如何解决 多进程使用单值信号量协调,设置 SEM_UNDO, 执行semop 时返回 errno = ENOSPC,如何解决 如何用asp连接db2数据库,请附带源码(急) 高分求救 我下载了一个linux2.4.6正式版内核,它是作什么用的?一定给你分,帮帮忙! “神舟三号”飞船发射成功 巨简单,可是俺不会! 有20kg的盐水浓度为60%,第一次取出40%的盐水,然后用水加入等量盐水,然后再取出20%的盐水,在用水加入,问这时盐水浓度为多少? 四块质量均为m的相同的砖,夹在两块竖直木板间,木板两侧施以相同压力F,使砖静止,求A,B,C,D各自在水平方向所受到的压力大小还希望求一下BC之间的摩擦力 有一个梯形,他的上底是5厘米,下地7厘米,如果只把上底增加3厘米,那么面积就增加4.5厘米,求梯形的面积有一个梯形,他的上底是5厘米,下底7厘米,如果只把上底增加3厘米,那么面积就增加4. 在地球上的一个物体在某高度处所受的重力是在地球表面时所受重力的一半,则它距地面的高度是地球半径R的? 如图所示,两块相同的竖直挡板A、B之间有质量均为m的四块相同的砖a、b、c、d,用两个大小均为F的水平力压木板,使砖静止不动,则A板给砖a的摩擦力大小是 ,方向为 ;砖b给砖a的 如何让孩子改掉粗心的坏习惯 ”我相信你的努力会有回报的”用英语怎么说? 两块相同的竖直木板A、B间有质量均为m的四块相同的木块,用两个大小均为F的水平力压木板,使木板均处于平衡,如图所示.设所有接触面间的动摩擦因数均为μ.则第2块对第3块的摩擦力大小 8、下列句子中省略号起什么作用?把正确答案的序号填入括号. A表明心理活动的时断时续.B表示省略递增的次数.C表示语意的跳跃.D表示说话结巴,欲言又止.(1)是他来啦?……不,还没来!…… 我相信自己是最棒的英语怎么说 如何改掉孩子粗心的坏毛病? 判断下列句子中省略号的作用,把正确的序号写在括号里.①表示引文的省略;②表示列举的省略;③表示说话的断断续续;④表示话未说完.放糖,纸包糖,还有面包皮和各种的小骨头……( 因此我相信,努力才能创造出美好的未来 这句话用英语怎么说 如何让孩子改掉粗心的坏毛病呢? 物理求电梯的钢丝绳拉力怎么求?请问这题怎么做:一大厦为方便人们上下安装了垂直升降式电梯,下面的表格摘录了该电梯的铭牌.电梯正常运行时,若所载15人平均每人质量为60kg,测的电梯从 重力方向是竖真向下的,那是不是垂直于地面向下? 我做题目爱粗心,请问怎样才能改掉这个坏毛病? 1个上底是20厘米,下底是32厘米的梯形,下底延长1/4,面积比原来大76平方厘米.求原梯形的面积 在两块相同的竖直木板之间,有质量均为M的4块相同的砖,用两个大小均为F的水平力压木板,使砖静止不动,则第二块对第三块砖的摩擦力大小是多少?要分析过程.我这个发不了图,只能麻烦各位想 一根钢丝绳能承受的最大拉力为1.5乘10的四次方N通过计算说明,用此钢丝绳能否提起体积为0.2立方米的钢锭?用此绳所能提起的货物最大质量是多少(钢的密度7.9乘10的三次方kg/m的三次方),急, 一个直角梯形,如果把上底延长5厘米,面积就增加25平方厘米,而且变成一个正方形,原来梯形的面积是多少平 为什么不可以说重力方向是垂直与地面,或者垂直向下呢?非要说竖直向下呢? 某钢丝绳能承受的最大压力是4×10的四次方,如果用这条钢丝绳使3.5t的货物匀加速上升,则物体在7s内发生的速度改变不能超过多少?4×10的四次方N 一个直角梯形,如果把上底延长5厘米,面积就增加25平方厘米,而且变成一个正方形,原来梯形的面积是多少?要有算式。 求 所有公式 4.举重运动员把重1500N的杠铃举在2m高处静止不动时,下列说法正确的是( ) 某人在静止的地面,最多可举起重60kg的物体,g=10m/s^2 (1)当这人站在以a=2m/s^2加速上升的电梯里,最多可举起多重的物体?(2)当这人站在以a=1m/s^2加速下降的电梯里,最多可举起多重的物体? 如图所示,压力F均为100N,物体重30N,物体与两木板之间的动摩擦因数均为0.2,求:要用竖直向上的力将物体拉出来,所需拉力的最小值是多少? 举重比赛中 当运动员举起杠铃时 运动员受到的重力与地面对他的支持力是不是一对平衡力 什么时候重力等于万有引力? 某中学对八年级男生进行引体向上的测试,以做7个为标准,超过的个数用正数表示,不足的个数用负数表示,其中八名男生成绩如下:+3 -2 0 +4 -1 +2 -5.1.这8名男生有百分之几达到标准?2.他们共做了 一个体重为500牛的举重运动员,最多可举起1500牛的杠铃此人在地面上使用滑轮所用的力为何会小于1500牛? 26、某校九年级的一场篮球比赛中,如图队员甲正在投篮,已知球出手时离地面高 m,与篮圈中心的水平距离7m.当球出手后水平距离为4m时到达最大高度4m,设篮球运行的轨迹为抛物线,篮圈距地面3m. 重力的方向总是垂直于地面是否正确? 怎样改掉做事丢三落四,粗心的坏毛病.我经常忘掉生活中一些细节,例如在外面吃饭忘带钱,出门忘记带钥匙,去网吧忘记带身份证,还有经常遗失钥匙,手机之类的东西,工作中也是大错不犯,小错 如图,小明跳起投篮,已知球出手的时候离地面高20/9m,与篮圈中心水平距离为8m,当球出手后水平距离为4m时设球运行的轨迹为抛物线,篮圈中心离地面三米.(1)求能否投中?(2)再出手交度和力 在画图时,由于是二维画面,则重力方向是竖直向下,但仍然与地面垂直,那我在下半圆时的重力指向那里呢,指向太空吗? 一根钢丝绳最大承受5×10^4牛顿的力,用它可以吊起最大的钢锭的体积是多少?p钢=7.9*10^3kg,g取10N/kg 修改病句中复原号的样子 26)已知等腰梯形ABCD,AD‖BC,对角线AC⊥BD于O,AD=5cm,BC=9cm,求梯形的面积 如果我用10000牛顿的力量击向一个原子弹是否能爆炸 用10000牛顿的 力量击向一个人的头部呢? 请大家看看该病句如何修复所有营销业务员跟踪洽谈业务时客户必须成书面汇报给公司,以便公司存档和通知其他业务员不重复跟踪乱报价造成客户对公司印象的评价. 已知等腰梯形abcd,ad//bc,对角线ac⊥bd于o,ad=5cm,bc=9cm,求梯形的面积 体重超过标准体重的30%可见于()a.甲状腺功能亢进 b.肾上腺皮质功能亢进 c.恶性肿瘤 d.活动性肺结核 e.1型糖尿病 同学们都说,改病句 四块质量均为m的相同的砖,夹在两块竖直木板间,木板两侧施以相同压力F,使砖静止,则MA 、AB 、BC、CD、D间摩擦力大小分别为多少?麻烦要详解、、、以前做过,忘了 我怎么才能改掉我做数学题的粗心习惯现在已经高三了,做题习惯不改的话就完了,我要怎么办不是掌握不牢。时间不多,做定正本时间不多啊 阳光通过窗口射到室内,在地面上留下2.7m宽的亮区,已知亮区到窗口下的墙角距离EC=8.7m,窗口高AB=1.8m,求窗口边角离地面的高BC 一个梯形的面积是72.9平方厘米,上底10.4,下底是5.8厘米,高是多少?要算式 一个梯形,它的上底延长3厘米,就变成一个正方形,而且面积增加9平方厘米.你能求出梯形的面积吗? 如图,已知窗口高AB=1.8m,窗口底边离地面的高度BC为4m.阳光通过窗口照到室内,在地面上留下亮区DE,亮区到窗口下的墙角距离EC=8.7,试求亮区DE的长度. 一个梯形的面积是72.9平方厘米,上底是10.4,下底5.8.高是多少厘米? 怎样改掉粗心的坏习惯卷子一发下来,我发现我因为粗心而错的地方多的夸张!大家知道怎样能改掉这个毛病么? 一个质量为50千克的人站在电梯中,则下列各种情况下电梯底面对人的支持力大小和方向:(1)人和电梯一起静止不动:( )(2)任何电梯一起匀速上升:( )(3)匀速下降:( ) 一个梯形,高乘以上底得36平方厘米,高乘以下底得72平方厘米,这个梯形的面积是( )平方厘米. 一个直角梯形上底与下底的比是3:5如果把上底增加7厘米下底增加1厘米就变成了一个正方形求梯形的面积是多 说说下列句子的省略号、破折号、引号的不同用法(1)爱迪生又发明了电影、留声机……他一生发明的东西有一千多种.( )(2)指导员对我说:“你们要……好好……念……书……将来… 如图,在菱形ABCD中,DE⊥AB,垂足为E,DE=6,sinA=3/5,则菱形ABCD的周长是 如图所示,在两块相同的竖直木板之间,有质量均为m的4块相同的砖,用两个大小均为F的水平力压木板,使砖静止不动,则:第2块砖和第3块砖之间的相互作用的摩擦力为多大; 希望能详细说说.高 怎么改掉粗心的习惯?前几天参加物理竞赛,由于我的粗心大意做错了一道很简单的题,丢了15分,要是再加上这15分我就获奖了!我非常后悔,却没办法!都是粗心惹的祸!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘