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

设计简单的屏幕保护程序 -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、WP双系统若要发展 难题不断 即将于下周召开的微软Build 2014六个愿望清单 【独家专访】腾讯陈磊:你不知道腾讯对开源有多爱 地下数据交易网站Rescator被黑,疑似Target报复 Spark独门秘籍:打造结构一体化、功能多元化的高效数据流水线 【走进支付宝】重磅嘉宾!历届“走进企业”回顾 【OSTC讲师专访】腾讯TDW项目:开源的分布式数据仓库 ID爆发的物联网时代,我们该如何管理手中的数百个账户 取代Google Maps?苹果大幅优化Apple Maps用户体验 中交兴路系统架构师杨晓明:Hadoop+Storm+ HBase…,打造交通行业创新型服务 雨果·巴拉的第二春:我与小米的那些事儿 为什么Android Wear能统领智能手表领域? LinkedIn缘何抛弃Ruby,转投NodeJS怀抱 【OSTC讲师专访】九秒社团李明:开源对游戏产业的渗透与帮助 IBM 2014中国论坛:挖掘新互联网时代下“智慧企业”的发展之路 Facebook工程部副总裁Cory Ondrejka谈企业在早期所遇到的管理瓶颈 小团队管理工具选择:不需要大而全 《近匠》聚合CEO左磊:基础数据免费,API开放 IDC:HTML5与原生应用之争还将长存 不甘称臣,Google誓要击败Amazon 【OSTC讲师专访】腾讯追风(QcloudMna):开源移动加速SDK Google Go:一门为云而生的编程语言 3月26日:没有Larry Page,就没有今天的Google Hortonworks再获1亿美元融资,Hadoop领域三足鼎立 Intel收购Basis Science,欲拓展可穿戴设备市场 Facebook以20亿美元收购Oculus:虚拟现实将是未来计算平台又一大事件 基于NodeJS的14款Web框架 Hadoop导航:版本、生态圈及MapReduce模型 把黑匣子送上“云” 失联困境能否不再 看看全球十大电信巨头的大数据玩法 尹绪森:打开圈子拥抱变化,谈Spark玩家的自我修养 用于从INI文件中读字串的函数是什么?请示高手! 清問:Datareport實現不了的功能如何實現?清大蝦指教,謝謝! 检测下拉列表中批配项,有则选中 为什么DBGRID显示一片空白,记录应该取到了。代码如下: 谁有免费出国代理,急用。如果能有,马上给分 关于学习.net与j2ee的抉择问题,欢迎各位大侠热烈讨论!!! 求PHP代码,功能是:判断字符是否全部为汉字? 又是MSFlexgrid的问题!!!请大家帮忙~! ActiveX访问数据库的问题? REDHAT LINUX 7.2下如何建立多个用户?多谢指点! 关于网线!高分!!!!! 关于生成文件的方法? 课程表开发 请问各位前辈,是否只有新增加的字段才有可能成为计算字段?谢谢! 俺要写一个简单的文本的报文,string类型的 关于生成文件的方法?..... 有谁能告诉一下我CVS和SSF是什么?,具体是指些什么?? WIN2K 的问题:1、怎么允许本地普通用户(user)关机;2、怎么能让本地普通用户开机后,客户机连接到SQL SERVER?3、为什么我的SQL量SERVER2K需要停止然后再启动客户才能用? 如何用VB把存储在ORACLE库中的图片字段取出成.JPG格式的图片文件????急在外出差呀多谢了~~~~~ 如何退出函数?exit function??? 测试2000的TCP/IP是否通,用什么命令 求助开发课程表提示 (*****向斑竹你提个小见意,大家最好都来看看,这个想法好不好!****) 为什么我做的增加功能有两个必须要按两次“添加”按钮才能新增一条记录啊? 很急,请教高手,如何把一个ip格式的字符串转换成ip类型,不是用getbyname(),而是像int和string转换一样的概念 请问如何让基于对话框的工具条一开始就浮在上面 来者有分,关于ado的 毛子青论文<<动态规划的优化>>,一个最长子序列的算法,请高手看过来(给出c实现代码的送20分!) 在鼠标单击时间中,可以使用什么函数取得鼠标点击处的坐标值 怎样在单击左键时弹出PopupMenu? 连续20多天加班,近来明显感到体力透支,做个调查!!!(有分) ASP调用VB编写的ActiveX DLL的问题 请教一sql语句 在Unix下用cc(实际上是cc_bundled文件)编译c程序时,报错“const" will become a keyword,或者告诉我“Function prototypes are an ANSI feature" 为何加入winsock2.h后会出现很多问题? 热烈庆祝:Kingron重出江湖!!!菜鸟们有福喽……散分 you shen me qu bie ? please tell me , xie xie ! [■■■Delphi猛料■■■]V1.3发布~~~~~~~更新到2001.12.12 提问:如何在ToolBar上加控件? 我在OLE里调用了word2000文档,为什么只显示第一页,我查了半天资料都没有解决,请帮我 哪里有多媒体软件制作论文啊? 继续请教各位前辈:能否将非新增加的字段定义成计算字段?谢谢! 软件创意、需求大汇集:列创意,拿专家分,120分值大赠送(以后可继续追加) 局渔网 巨简单问题~~~ 进来有分,回答多分,不够再加!!! 关于关闭和启动数据库的问题,很急的!! java VS c#^-^ ?? 请进 寻求QuickReport3以上版本 for Delphi3 的源代码或者安装包? 請問哪大俠用過 ibm 的 bridge2java啊,我把Excel的所有類都導出來了,但它的QuickExcel.java文件還是運行不了, 求救!新装了一块硬盘,为何找不到呀? SetWindowLong函数在delphi里可用,为什么在c++builder 中不能用??? 为何往结冰的公路上撒盐? 海水结冰解冻后,会不会变成淡水?我在书上看见的,它说会.如果真的会,请简述下原因,不须长篇大论,对不起,说错了我说的是冰冻一些海水,再拿去其他地方解冻. 在积雪的路段上撒上盐后,即使在相同的气温条件下,融化成水的冰雪不再结冰了,这是为什么? 为何清除道路冰冻积雪时要撒盐 温度计的测量范围是多少到多少? 温度计有何作用,使用方法,如何查看. 大家都知道压强越抵,水的沸点越低.那如果把水放进太空那种真空环境 ,它的沸点是多少呢?又是以什么方式沸腾呢? 为什么海水结冰后,再融化可以变为淡水(如,北极冰山) 撒盐在水上能令水难结冰点吗?就这样 求压强与水的沸点的关系式. 海水和淡水结冰有什么区别 冬天在结冰的地上撒盐为什么可以防止水再结冰要用物理的知识,最好是熔化和凝固的知识 冬天为什么在道路上撒盐能让冰融化说说具体原理和知识, 海水与淡水的结冰温度相同吗? 为什么结冰要撒盐在路上? 为什么冰撒了盐后会溶化的更快? 海水冰冻后的冰块是淡水海水如果结成冰块,那这个冰块是不是可以食用,不会像海水那样水的来源爱斯基摩人的饮用水是十分珍贵的.他们需要到冰山上去取回冰来融化,才有水用.因为北冰洋 云在物理里是液态还是固态 真空中水的沸点是级°C?rt 实验室蒸馏水装置温度计的作用是什么? 霜是固态还是液态霜是由空气中的水蒸气凝华而成,而凝华是把物质由气态直接变为固态,这么一推那霜不就是固态了么?可我听说霜是液态. 冰冻的路面为什么要撒盐?目的是什么? 寒暑表的用途是什么 固态,液态,气体 她们的物理性质它们的物理性质分别是什么?有什么不同?该如何区分? 在结冰的道路上撒盐是为了降低冰的什么拜托了各位 一种青铜器重达832.84千克 高达133厘米 铜 锡 铅的比大约是85比12比3 而铜 锡 铅各是多少 光测温度计、电子温度计及色带温度计有何不同? 蜡烛和猪油凝固时是向下凹还是向上凸 为什么要用铜与锡合金制成青铜器物? 锡用盐酸腐蚀后,在液体里怎么还原 为什么要向结冰的公路撒盐? 铜的比例越高,青铜器就越____ 二价锡的还原性问题向少量0.2mol/L的SnCl2的溶液中,滴加2mol/L的NaOH溶液使生成的沉淀溶解,然后滴加0.2mol/L的Bi(NO3)3溶液,立即有黑色的金属铋生成.跪求大神指教“全部”反应方程式. 人们往冰冻的路面上撒盐,这是为什么 制造青铜器在铜里加入锡是为什么? 雪灾后,护路工人常在路面上撒大量的盐,撒盐后,冰雪融化的温度将如何变化 小明同学点燃一支蜡烛,不小心蜡油溅到了手上,他啊的一声,发现蜡油在手上凝固,可手上却烫起了泡.请说明小明手上起泡的原因. 青铜器是哪三种金属的合金 A铜铁铝 B铜银铅 C金银铜 D铜锡铝 锡渣如何还原?我有个锡炉,每天产生的氧化锡有好多,好浪费,有没有什么办法回收或者还原? 蜡烛和蜡油有什么区别?蜡油能当蜡烛用么? 海水为什么不容易结冰啊? 雨雪冰冻天气中,常在路面上撒盐以防止路面结冰, 点燃的蜡烛,蜡油会一滴滴地滴下来,这是蜡的什么过程;冷却后,蜡油又变成了蜡块,这是蜡油的什么过程.我是初2的学生,在物理上遇到有不懂的问题, 淡水和海水那种结冰快? 液体暖手宝如何复原回透明液体?我买了个液体暖手宝,就是那种不用电的,掰一掰金属片就能用的那个.刚买回来时候是透明的和水似的液体,但用完一次以后,硬了,想再还原,就放到沸水里加热, 热胀冷缩是分子变大?分子会变大吗?还是别的什么? 水银温度计测量范围实验室里的水银温度计最大测量范围标记的是300℃,每小格代表温度2℃,但在80℃到300℃之间就省略了每小格2℃的标记,也就是说从80到300之间只有10小格的间隔,这是为什么? 在相同气温下,为什么水不再结冰了?针对这个问题,小明的猜想是:撒盐改变了水的凝固点.设计一个方案验证他的猜想是否真确? 为什么冬天在路面上撒盐就能使融化了的冰雪不在结冰的实验设计:为什么冬天在路面上撒盐就能使融化了的冰雪不在结冰的实验 一种铜,锡合金有质量78%的铜.余下的为锡,问这种合金的密度是多少? 一种青铜,内含铜88份,锡10份,锌2份.要炼制这种青铜600吨,需要铜.锡.锌个多少吨. 寒冷的冬天.雨雪天气的道路上往往会结冰.在道路上撒些盐能加快冰的溶化.说明其中的道理. 一块合金体,质量为m,体积为v.已知金的密度为P1,铜的密度为p2,求该合金体的含金量?含铜量?(表达式). 青铜是由铜,锡,锌按44:5:1熔制而成的.现在要炼制800千克青铜,需铜锡锌多少千克? 为什么冬天要在马路上撒盐来加快冰的溶解? 温度计的测量范围是 温度计正确的使用方法 为什么温度高时,物体的分子之间的空隙会胀大 温度计的测量范围寒暑表、水银温度计、气温计的一般量程,最大及最小刻度.不要最高限度,一般用的就可以了 温度计用法买了个水银的温度计,想通过口含的方式,早上起来测量基础体温,但是测量后,我该怎样消毒,以方便下次干净的使用?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn