摘 要 在电脑、网络普及的今天,PPT(PowerPoint)以其制作简单,功能强大,被广泛运用在专题讲座、工作汇报、项目申报、单位年终述职、述廉等工作中。 比如在单位年终述职、述廉工作中,因为参加的人员较多,为了公平起见,给每人限定时间用PPT演示文稿对自己的工作做介绍,所以设计一款小程序对PPT演示文稿进行记时有一定的实用价值,本文以限定6分钟演示时间为例,介绍VB程序设计、实现的全过程。
【关键词】VB程序设计 PPT演示文稿 记时
1 引言
本程序为驻留程序,设计监测、显示、处理三个模块,监测模块一旦监测到PPT演示文稿运行,立即调用显示模块显示PPT文稿演示时间,如果演示时间到,处理模块将关闭PPT演示文稿,并提示:演示时间到。
程序流程图如图1所示。
2 实现过程
2.1 处理模块的实现
该模块的主要功能是关闭PPT文件,定义一个Killppt(Sppt As String)过程实现。
Private Sub KILLppt(sPPT As String)
Dim PPTSSot As Long
Dim PPTppss As Long
Dim PPTpe As PPTRY32
PPTSSot = CreateToolhelp32Snapshot(&H2;&, 0&)
If PPTSSot <> -1 Then
PPTpe.PPTSize = Len(PPTpe)
PPTppss = Process32First(PPTSSot, PPTpe)
Do While PPTppss
If LCase$(sPPT) = LCase$(Left(PPTpe.PPTexitfl, InStr(1, PPTpe.PPTexitfl, Chr(0)) - 1)) Then
Dim PPTss11 As Long
Dim PPTcode As Long
PPTss11 = OpenProcess(1, False, PPTpe.PPT32pss)
TerminateProcess PPTss11, PPTcode
CloseHandle PPTss11
End If
PPTppss = Process32Next(PPTSSot, PPTpe)
Loop
CloseHandle (PPTSSot)
End If
End Sub
2.2 监测模块的实现
该模块主要检测PPT演示文稿的运行,一旦监测到PPT演示文稿启动运行,调用显示模块开始对PPT演示文稿运行时间进行倒记时,并在屏幕最上方显示倒记时效果,一旦设定的PPT文稿演示时间到,该模块调用处理模块关闭PPT演示文稿,并提示“您的演示时间到”信息;该模块还有一个功能就是保证显示模块一直处在最上面透明显示,不因为演示者操作电脑影响显示效果,通过VB时钟控件实现,主要程序代码如下:
Private Sub Timer1_Timer()
'如何窗体不在最前面,就把窗体放到最前面并透明
If pptrtValue <> SetWindowPos(Me.hwnd, HWND_TOPMOST, Me.CurrentX, Me.CurrentY, 300, 300, SWP_SHOWWINDOW) Then
Call SetWindowPos(Me.hwnd, -1, 0, 0, 0, 0, 3) '调用窗体处理的API函数,“通用“处申明
Me.BackColor = vbRed '透明色为红色
SetWindowLong Me.hwnd, -20, GetWindowLong(Me.hwnd, -20) Or &H80000;
SetLayeredWindowAttributes Me.hwnd, vbRed, 0, 1
Label1.BackColor = Me.BackColor
End If
BorderStyle = 0
If Exitppt("POWERPNT.EXE") Then '检测进程
a = Val(a) - 1
If a = 0 Then
a = 60
b = Val(b) - 1
End If
Label1.Caption = b & "分鐘" & a & "秒" '显示模块显示PPT演示文稿倒计时
If b = 0 And a = 1 Then
a = a - 1
Call KILLppt("POWERPNT.EXE") '调用处理模块关闭演示文稿
Label1.Caption = "您的时间倒,谢谢!"
a = 60
b = 5
End If
Else
a = 60
b = 5
End If
End Sub
2.3 显示模块的实现
显示模块也就是程序的界面,程序运行后驻留内存,当监控模块监控倒PPT演示文稿运行时,程序界面在屏幕左上方出现,显示PPT演示文稿倒记时效果,程序代码如下:
Private Sub Form_Load()
Call SetWindowPos(Me.hwnd, -1, 0, 0, 0, 0, 3)
Me.BackColor = vbRed '透明色为红色
SetWindowLong Me.hwnd, -20, GetWindowLong(Me.hwnd, -20) Or &H80000;
SetLayeredWindowAttributes Me.hwnd, vbRed, 0, 1
Label1.BackColor = Me.BackColor
a = 60
b = 5
End Sub
3 几点说明
(1)为了提高编程效率,本程序使用了以下几个窗体处理和程序线程、句柄处理的API函数,可以在窗体代码的“通用部分”声明,本文略。
SetWindowPos,SetWindowLon,SetLayerpptedWindowAttrpptibute,GetWindowLong
CreateToolhelp32Snapshot,Process32First,Process32Next,OpenProcess,TerminateProcess, CloseHandle
(2)程序需要的数据结构如下,窗体代码“通用部分”声明。
Private Type PPTRY32
PPTSize As Long
PPTUge As Long
PPT32pss As Long
PPTfls As Long
PPTexitfl As String * MAX_PPT
End Type
Const PPT_PALL = (&H1; Or &H2;& Or &H4; Or &H8;)
Const MAX_PPT As Integer = 260
Dim a as integer
Dim b as integer
(3)程序在固原市氣象局多年运行稳定,程序运行后驻留内存,无任何操作界面,倒记时显示醒目,受到喜爱。
(4)在窗体代码“通用部分”申明Exitppt函数,该函数为Boolean类型,用于遍历内存中是否有PPT文件运行,供监控模块调用,函数如下:
Function Exitppt(ByVal PPTexe As String) As Boolean
Exitppt = False '先将该函数过程赋值为假
Dim PPT_Hshot As Long, PPT_pcess As PROCESSENTRY32
PPT_Hshot = CreateToolhelp32Snapshot(PPT_PALL, 0&) '给系统进程创建快照,调用成功 则返回快照的句柄
PPT_pcess.dwSize = Len(PPT_pcess)
r = Process32First(PPT_Hshot, PPT_pcess) '初始遍历进程
Do While r
If Left$(PPT_pcess.szExeFile, IIf(InStr(1, PPT_pcess.szExeFile, Chr$(0)) > 0, InStr(1, PPT_pcess.szExeFile, Chr$(0)) - 1, 0)) = PPTexe Then 'left '通过进程列表,判断是否有PPT文件运行
Exitppt = True '该函数返回真 进程存在
Exit Do '循环退出
End If
r = Process32Next(PPT_Hshot, PPT_pcess) '遍历下一个进程
Loop
End Function
4 程序运行效果
参考文献
[1]王娟,黄耀群.基于C++ Builderppt 的串口通信程序实现方法[J].煤矿电气,2014(02).
作者简介
张玉虎,宁夏固原市气象局工程师,从事气象设备保障维护工作。
作者单位
宁夏固原市气象局 宁夏回族自治区固原市 756000