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

设计简单的屏幕保护程序 -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
【问底】王帅:深入PHP内核(一)——弱类型变量原理探究 谷歌Kubernetes专访:未来BigTable开发只是课后习题 首届“最具价值CTO”评选来啦!我们在找你! 【CTO俱乐部走进顺丰总部】活动图文直播进行中 中国第一个云主机评测发布:天翼云性价比第一、青云质量第一 Ruby 2.1.3发布,降低内存消耗、修复众多Bug! OpenHW2014开源硬件总决赛鏖战西安 AMD力推异构计算 《坦克世界:闪电战》:PC转手游,不止免费! 【讲师】道里云毛文波:网络虚拟化与SDN实现Docker连通 性能测试:SequoiaDB vs. MongoDB vs. Cassandra vs. HBase 华云数据推运营型PaaS Plus平台,联合Tmax走出“去IOE”的云化之路 聚焦移动新势力 MDCC 2014免费展位团队名单公布 详解Google Authenticator工作原理 云计算的乐高玩具,Docker从根本上改变应用程序开发 【先锋】eSage缔造异构虚拟化管理技术,做数据中心核心思想执行者 Uplinq2014:亲身体验Vuforia与智能眼镜设备 MDCC 2014 移动开发者大会议程全面揭晓! 顺丰模式:物流行业“互联网化”的科技之路 移动应用云服务工具APICloud宣布完美适配iPhone6 从应用分发到能力开放 华为开发者联盟沙龙上的共赢理念 SOOMLA框架:移动游戏分分钟创建个虚拟商店 Facebook:如何让应用适合所有系统、带宽以及屏幕 Docker实践者不能错过2014 Container技术大会的九大理由!(讲师议题全面揭晓) 2014全球云计算大会中国站(CC China)精彩集锦 腾讯X5浏览服务正式开放 30多款APP成为首批受益者 Node.js设计经验谈 LeanKanban University首位中国认证讲师路宁:看板会为更多国内企业带来深刻变革 环信IM沙龙纪实:无分享不IM,无社交不未来 【工具推荐】ESL:更简洁、更高效的标准加载器 【先锋】亲加通讯云:以云服务模式为App提供社交引擎 2014中国移动开发者大调查第一批获奖名单大曝光 请问如何添加备注字段,用sql server建表,有一备注字段为text类型。。。。。。。。。。。 函數啊﹐怎么么搞的?氣死人了。一百求救。 关于数据库的问题 生命游戏问题!!!!那位大哥指点迷津 VB做的免费软件,大家随便下载!给我提点建议也行! RichEdit问题,急!!! 关于IF语句。我是新手我理解不了请高手帮我,谢谢 请问oricle 有没有像sql server 2000 的企业管理器一样的工具? 关于richedit的问题! 誰能告訴我﹐我給他發又發(88分求找) asp.net就没有什么不足吗? 问题:高级程序员的《数据结构》该怎么复习?请有经验的人给指个明路,多谢! 如何将中文文件存入数据库?是文件,不是表单,谢谢!! 怎样才能得到CDialogBar的控件(如Button)的消息及消息处理 子数据窗口中为什麽filter条件不起作用?急急!!在线等!!!! 菜鸟来了! 怎么把Demo_Adhoc分到两台机上运行 数据库更新 how to 用 insert into 把一个.zip文件保存进数据库?? 请大家推荐一个CD机吧!!!! 急,NOTES与SQL SERVER的问题 asp实例 我的Access库文件原来大小是6.78M,我清空所有记录和减少很多记录时,为什么大小没改变? 关于delphi动态加载控件,在线 代人提问:请问.dcu文件是干什么的?如何才能生成该类型文件。 怎么响应Enabled属性 asp.net做网页,运行后,<asp;....></asp:...>字段仍然存在?? 请教VB高手们一个高难问题! 请问,存储过程在VC如何调用,用ADO,ODBC。 怎么实现这个SQL? 没事瞎问~~~黑客软件能走向海外吗?(比如扫描器,键盘记录器,木马等) windows protect --error ,我装不了系统啊 DbEdit里的数据用adoquery如何更新才好? 有没有办法调试存储过程? 我是个菜鸟,请教大家,VC++和C++ Builer的优点和缺点。 请问如何改变显示文本的颜色? delphi 6 的补丁包 浏览器为NS6时如何获取屏幕分辨率? 如何控制 ValueListEditor ?有一个Help这样写道: 各位斑竹请进来,紧急求救呀!!!!! 是否可以把用asa建的数据库转变为access? 在java中如何压缩和解压文件夹? 如何在运行期把最大化,最小化按钮灰掉!? 求一句广告词 请教一个毕业设计的问题,关于在c++buileder中OLe对象调用:怎么样把word中的表格导入到数据库 请问如果在首页中加入一个论坛的登陆对话框? 这样的IIS错误信息,是什么意思,怎么解决? 问一下,vb怎么连接数据库呀`~(access)有代码吧~~给分呀` 如何画箭头? C#进行嵌入式开发,方便吗? 她为什么看上我??! 氢气还原氧化铜注意事项题目是这样的氢气_____出_____归,酒精灯______到______退 电解池中电子是从电源负极流出还是从阳极流出 电源的作用是电源内部不断的使正极聚集————,负极聚集————以持对外供电.,是一道填空题 哈,————为所填的空,希望各位人士给小女帮帮忙```~一道物理题,明天要交,摆脱了! 氢气还原氧化铜 电解池阳极是铜片,阴极是铂片,反应一段时间后,反接电源反接后,铂片上的铜溶解掉之后,铂片为什么不能继续溶解,电镀至铜片上?铂的放电顺序不是在铜前面吗? 电源的作用是在电源内部不断地使正极聚集什么,负极聚集什么 电解水时()发生了改变,分解成(),这些()又重新组合成新的().这个变化属于()变化 甲醇与高锰酸钾与硫酸生成二氧化碳和硫酸锰和硫酸钾和水的反应方程式 电源的作用是在电源内部把电子由负极不断地搬运到正极,从而保持两极之间有稳定的电势差.这句话对吗 在电解水的反应中什么发生了变化?什么没有改变 高锰酸钾和硫酸和碳酸钾反应生成硫酸锰和硫酸钾和水的方程式配平 电源内部电子在外场力作用下由正极移向负极吗 氧化汞 氯酸钾 氧化镁 氩气 的化学式分别是什么?谢谢! 硫酸锰和过硫酸钾发生氧化还原,生成高锰酸钾,硫酸钾,和硫酸,怎么配平? 1.把一只电阻R1接到某电源上,此时电路中的电流为0.3A ,若在电路裏并联一只30欧姆 ,此时乾路电流为1.2A 求电源电压和电阻R1的阻值 .. 分析化学中,反相—液相色谱,流动相极性越小分离度怎么变化? 硫酸锰(MnSO4)和过硫酸钾(K2S2O8)两种盐溶液在银离子催化发生氧化还原反应,生成高锰酸钾,硫酸钾和硫酸1.写出并配平化学方程式2.反应中的还原剂和氧化还原产物分别是?3.若该反应所用的硫酸 把一只电阻R接到某电源上,此时电路中的电流为0.6V,若在电路里并联一只30殴的电阻,此时干路的电流为0.8A,求电源电压和电阻R的阻值 反向色谱中为什么流动相极性增加保留时间变大 电解池中电子流向如何?是不是从电解池负极流出流经电解液回电源正极 紫外可见吸收光谱的产生原因 氢氧化钠和氯化氢的异同点根据物质组成和性质 甲醇和稀碱反应吗?甲醇和稀碱(大概1%左右的KOH),理论应该不反应的,可为什么我配好碱,再加甲醇的时候,烧杯有发热的现象. 紫外可见吸收光谱中的B 带是脂肪族的特征吸收带.是正确的吗? 5个氩气分子的化学式?难道氩气不是由原子构成的吗?化学试卷的第一道题就让我无从下手. 为什么反相色谱中的流动相极性越小容量因子越小呢?我总觉得极性越大对样品的吸引力越大,越容易洗脱,或者更难挂在固定相上,怎么会极性越小,容量因子越小呢? H3PO4与碱反应问题将3MOL 的KOH溶液在加热煮沸的条件下加入一定量的纯P2O5粉末,恰好充分反应后,将溶液蒸干得到219.6克不含结晶水的固体.求此固体的质量组成及加入P205粉末的质量 请问不同杀菌条件,如65℃,30min; 75℃,15s; 75℃,30s;75℃,60s对牛奶酸度的影响有何不同,及原因, 氢氧化钠和氯化氢化学试 甲醇和磷酸反应生成的是什么?有什么用吗? 食品中总酸度挥发酸和有效酸度的关系 反向色谱,非极性色谱和液液色谱的区别?反向色谱固定相极性小,样品会有吸引,然后洗脱,那非极性色谱和液液色谱呢?非极性了,对样品中的东西不是没有吸引了,那不就成为了支撑物,不是成了 有人知道什么碱和磷酸反应生成磷酸氢2钠么什么碱和磷酸反应生成磷酸氢2钠么 1、牛乳酸度2、总酸度3、灰分4、恒重5、总糖6、粗脂肪7、单色光8、检样9、大肠菌群10菌落总数 高效液相色谱流动相为什么要用极性化合物 请问哪位知道 磷酸与碱反应生成盐的种类判断 什么动物冬天去南方 氯化氢通到氢氧化钠有什么现象如题 还有为什麽 正极一定是阳极,负极一定是阴极吗 某温度下,将1 mol CO和3 mol H2充入1 L的密闭容器中,充分反应后,达到平衡时 c(C0) =0.1 mol/L.若保持温度和体积不变,将起始物质的物质的量改为A mol CO、b mol H2 ,c mol CH3OH,欲使开始时该反应向逆反应 制取氢气用排空气还是排水法 阴极阳极分别相当于电池的正极还是负极还有,负离子移向阳极还是阴极 溶剂回收时如果加热温度太大,溶质跟溶液一同在加热过程中蒸出,还是先蒸干溶液再蒸发溶质的?有没有哪些实验可以测试到? 我想知道,某溶液里,溶质熔点为120,沸点为150而该溶液的沸点为50 1, 电压表和电流表在电路中是否等于一根导线? 阴极,负极和阳极,正极怎样区分 并联电路中怎么算总电阻比如说3欧的电阻和4欧的电租并联,那么电路中总电阻为多少 有一串小彩灯,其中有一个坏了,请你用一根导线或一个电流表或电压表进行判断、 三种方法都写、导线的方法我已经知道了,请帮忙写一下怎样用电压表和电流表进行判断、并说明一下为什么 4gH2完全燃烧,参加反应的氧气为多少克,生成水质量为多少 燕子为什么飞向南方? 液相色谱C18柱堵塞后如何冲洗柱子,能用纯水 阴极,阳极,和正极,负极,有什么区别? 并联电路的总电阻为什么是这么算的?并联电路的总电阻为:R=R1R2/R1+R2那为什么不是R=R1+R2呢一楼回答的我知道但我还是不懂为什么他要这么算本人有点笨 C18柱15厘米的粒径是5微米的,流动相是甲醇水,一般最大压力是多少啊 并联电路,干路中的电阻电流电压,是不是就电路中的总电阻、总电压、总电流?完了完了.我复习一下午结果稀里糊涂全搞混了 = =、 燕子在秋天的什么时间飞向南方 关于化学电解池.电解池中电子移动:电源负极→由导线→阴极→由溶液→阳极→电源正极 这是对的?可是溶液中不是是离子导电么 电子不是只能外电路么? 镁,锌,铁,铝各30克,分别与足量盐酸反应,生成氢气的质量各是多少? 并联电路电阻是怎么计算的呢?如题 是不是电解池的阴极连接外接电源的正极,而电解池的阳极连接外接电源的负极? 将镁铝合金5.1克溶于足量的盐酸中可产生氢气0.5克.求合金中镁、铝的质量
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘