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

设计简单的屏幕保护程序 -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
text()-JQuery API toggleClass(class)-JQuery API val(val)-JQuery API val-JQuery API after(content) -JQuery API append(content) -JQuery API appendTo(expr) -JQuery API before(content)-JQuery API clone(deep) -JQuery API empty()-JQuery API insertAfter(expr)-JQuery API insertBefore(expr) -JQuery API prepend(content)-JQuery API prependTo(expr)-JQuery API remove(expr)-JQuery API wrap(elem)-JQuery API wrap(html) -JQuery API add(elements) -JQuery API add(html)-JQuery API add(expr) -JQuery API children(expr) -JQuery API contains(str) -JQuery API end() -JQuery API filter(filter) -JQuery API filter(expression) -JQuery API find(expr) -JQuery API is(expr) -JQuery API next(expr)-JQuery API not(elems)-JQuery API not(expr)-JQuery API not(el)-JQuery API 请解释一下ActiveX控件中的方法和事件有什么区别? 有谁知道如何设置CreateDirectoryEX中的参数 请问在VC6.0中如何把数据文件做进可执行文件中?在线等待...... 编写DLL时,如何获得某一消息的lParam和wParam参数值 数据维护问题,请大家多多帮忙!在线等待! 请问如何取得用户在控制面板的国别设置中所设的国家或地区是什么? SaxException:File "c:\xml\reports.xml"not found MOV large fs:0 1234h是什么东西? 网页上浮动图片怎么做阿?急~~~ 无模对话框 我到底错在哪? 问一个很简单的问题?如何做一个链接到框架页! 这是不是病毒? 新作一系统需要用条形码输入,用asp.net作,需要与条形码输入器的硬件进行交流吗?条形码的硬件选用什么比较好?价格是多少? 请问各位大虾,那里有COM以及COLLECTION对象编程的文章和例程? 一个保存文件对话框的问题 一个很菜的问题,实在不会 sql语句怎么写? 关于服务器端和客户端通信的问题,急,请各位大虾帮忙 error LNK2001: unresolved external symbol "public: char __thiscall bcdtoasc::secondchar(char)" (?secondchar@bcdtoasc@@QAEDD@Z) 文本框的问题 关于 ACCESS 添加记录的问题? 为什么我在数据窗口中的sql语句中使用参数有错误?提示invalid和不完整! 在UNIX下如何编译C++程序 请教一个COM对象创建的问题 如何获取DropDownlist的SelectedItem.Text? lirun(笨笨狗)请进来领分 怎么得到数据库中的id值。 有点痛,不知道是什么病,大家帮忙看看 GOOGLE被中国"冷处理" 请介绍一本好一点的Winsock函数编程的书,电子书或者纸书都可以 关于全局CDatabase; mysqldump备份数据库时总是出错? 谁有http://211.100.6.72的源代码最好有附带的数据库连接说明。200 在2000server上安装oracle的问题,求教! 怎样深层理解delphi的类变量 数据库中日期范围怎么比较? 如何将Access的数据导入SQL-server 散分了,高手请进---.net不能够bug ???怎样在Delphi中对导出到Excel文件单元格进行划线???? 在VB中如何进行程序的数据输入有效性验证? 请上次回答我NT问题的同志进来拿分,上次只给了100 如何学winzip那样,在弹出菜单中增加一个新的项目 英国有好点的软件公司吗? 高分求救水晶报表问题? 从数据库中取最新的第10~第20条纪录的sql语句如何写啊?各位大侠帮忙啊 记录集问题 sco unix下可以运行tcpdump吗? 无法启动X,出现cound not init font path element unix:7100,removing from list...could not open default font 'fixed' 请问是否可以在VC++下编写一个声音程序,如何编写?(只要能发出一个或两个音符就可以了) 程序员今年还可以报吗? 温度计如何读数怎样看温度计的摄氏度(不是体温计)0下几摄氏度怎么看,每1cm代表多少摄氏度,回答的好的附加100分,不好的不加分 云南是地震多发区吗? 这段作文材料如何理解?阅读下面材料,从中提炼一个有意义的话题,然后围绕话题,写一篇不少于800字的议论问.老酋长病危,找来村中三个年轻人,要他们尽可能爬到神山最高处,回来报告见闻,以 假如一个温度计的读数是11C(就是那个摄氏度的符号,我这里打不出来),那么这个读数读作( )假如读数是-6C,这个读数读作( ) 云南地震频发的原因? 求一篇经典的作文素材,运用范围广的.上语文课前有课前活动,老师让讲作文素材,就是脱稿讲一个素材,然后分析可以从哪些方面写,每个方面简单分析一下.我的语文老师特别挑,我找不到好点 看温度计读数 求达人说一下这个词的意思 英语翻译我的冬天这个冬天我过得很开心,因为我能做许多我想做的事情,我常常和朋友一起玩电脑游戏,打羽毛球和购物.但是也有很多作业要做,这让我很烦恼.我的朋友帮助我学习英语,我们一 这个温度计怎么读数阿 "牛人,酷,达人,给力 生猛,搞定,"等词是什么意思 一篇作文里角度太大太广算不算好作文比如:题目就为感动,然后写被父母感动,被好人好事感动,被…感动,这样可以吗 经过点(1.-2)和0负1的直线的斜率是什么? 碱灰石是什么 达人这个词怎么来的 航天员在太空做什么实验 如图,宇宙飞船A在低轨道上飞行,为了给更高轨道的宇宙空间站B输送物质,需要与B对接,它可以采用喷气的方法改变速度,从而达到改变轨道的目的,则以下说法正确的是A、它应沿运行速度方向喷 量体温的温度计的读数——在口腔内的和腋下放置时、读数是否有相应的增减变动?增减多少? 飞船对接为啥是从低轨道加速?从高轨道减速 能对接上么? 碱的俗称是什么?只是想问问 什么是植物有机活性碱 有机活性碱的食品是什么?一定要对.好的追加50分 目前航天飞船的飞行轨道都是近地轨道,一般在地面上方300km左右的轨道上飞行,绕地球飞行一周的时间约为90min左右.若飞船在赤道上空飞行,那么飞船里的航天员在24h内可以见到日出的次数可 请问古代时的:儿子.怎说?还有爸爸妈妈. 请问富含植物有机活性碱的食品有哪些 小苏打是俗称的碱吗?可以当碱用吗? 拉风是什么意思.和它的由来是什么 什么含有机活性碱 飞行的宇宙飞船中可以用哪种笔钢笔 毛笔 铅笔 中性笔可以用哪个 为什么 拉风的起源是什么拉风这个词的准确含义,来源是什么? 使用下面三个词语组成一段话 蓦然 羁绊 奔突 直线l过原点和(-2,2)求直线斜率求只限倾斜角, 由来是什么 用下列词语组成一段话自出心裁,雷同,别具匠心 五孔一开关插座如何接?开关接灯,五孔供电.如图,怎么接.能够画个简易图的更感谢. 起源呢?拉风和出风头的不同点是什么? 选用以下词语组成一段话?请用以下词语组成一段话,大约300字,至少选3个词,耸峙云霄 黯然失色 惊心动魄 洪荒 啃噬 不盈不溢 推山拆地 扶摇 端倪 翎毛 燧木取火 泯灭 五孔一开关插座怎么接,开关只有一个接线口 海峡两岸的同胞都()祖国早日统一 老师()我们好好学习,将来报效祖国 爸爸出差3天了,我()他早点回来 宇宙飞船要在更高的轨道飞行应该点火加速,那么它是稳定后速度减小了,还是在加速过程中实际速度也在减小也就是说飞船虽然在加速,但由于轨道半径逐渐变大,实际速度却是在减小的?或是 五孔一开关插座的接法谢谢了,开关不要管着插座,开关 只管着 灯,然后插座长期有电,和开关没关系,大哥们别瞎说 我可不想接插了, 什么是抗酸成分?什么是抗碱成分例如Na2HPO4--Na3PO4哪个是抗酸成分 航天器的飞行轨迹为什么是正弦曲线 五孔一开关插座怎么接线 墙里有6跟线 3蓝2黄一红开关控制灯的 插座后面总共有6个孔 抗酸抗碱的用英语怎么说形容词啊 各个轨道的航天器速度不同,分别是多少?比如太阳同步轨道,极地轨道等 怎么读温度计的读数啊? 2.人体血浆中最重要的缓冲对是 ,其抗酸成分是 ,抗碱成分是 那些植物中含有秋水仙碱,要现在有的植物. 关于温度计的精确读数玻璃管内径越细和下端玻璃泡的容积比相差越多,由于温度变化而引起玻璃管内液面位置的变化也就越明显,温度计对温度的反应越灵敏请问是为什么呢= =能详细些么不 在CH3COOH-CH3COONa缓冲对中,抗酸成分是 ,抗碱成分是 有没有什么简单的方法检测植物体内所含糖和碱成分的高低? 云南省是地震多发地吗? 直流降压电路 我想把输出5V 500MA的电源降压到1.5V 300MA的输出应该怎么用什么电的路好配件 若直线斜率k=2,且过点(1,-2)的直线方程 我国西南地区是地质灾害的多发区,在云南贵州于什么等省接壤地带,形成了什么什么什么为主的灾害系统? 一顿石灰石需要多少煤 如何用直线方程求直线斜率? 云南是地震的多发区么? 什么叫“潮”?这个词是怎么发明的?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘