-
vb教程之自动记录应用软件工作时间
---- 实践中常常期望有一个小软件,它可以自动追踪记录当前应用软件进行工作的时间和内容,例如:使用Word进行文件编辑排版的时间和文件名称,使用AutoCAD软件进行制图的时间和图挡名称,玩某个游戏软件的时间和游戏软件的名称等等。本文讨论如何利用VB6.0编程实现这样的软件;本文的程序可同时追踪记录使用Word,Excel或AutoCAD14打开文件(包括打开网上邻居中的文件)进行工作的开始时间、结束时间(以秒为单位)和使用的文件名(包括完整路径)。
---- 下面给出从建立该软件的工程项目到最后生成可执行文件的全过程,这个程序的关键是下面的Timer事件(以1000毫秒为周期),它利用了微软的ActiveDocument技术(Active 文挡),使用函数GetObject来获取当前应用软件对象,用函数DateDiff计算时间差,利用微软的“Microsoft Windows Commn Control 5.0”中的控件“ListView”来实现数据显示界面;程序在Win98/NT下可以自动追踪记录使用Word97,Excel97和AutoCAD14的使用情况,具体叙述如下。
---- (一)建立工程(项目)vb_time.vbp:
---- 在C盘建目录:VB_TIME,今后我们将这个软件的文件都放到这个目录里。运行VB6.0,选“文件 | 新建工程”的“标准EXE”,出现窗体后可先将这个工程存盘:选菜单的“文件 | 工程另存为”,先取名“vb_time”存窗体(扩展名:frm),再取名“vb_time”存工程(扩展名:vbp)。
---- (二)增加控件ListView与Timer:
---- 在菜单中选:“工程 | 部件”,出现“部件”对话框后选:Microsoft Comman Control 5.0,这时在控件栏里可以看见一些新增加的控件,其中我们需要将其中的“ListView”控件放入到窗体中;放入该控件后,用鼠标右击窗体中“ListView1”,选“属性”,出现“属性页”对话框,在“通用”部分改变“查看”为3,“外观”为1;在“列首”部分插入4列,分别为:文件,时间,开始时间,结束时间. 将Timer控件放入窗体,并设置其Interval属性为1000(= 1秒)。
---- (三)增加代码:
---- (1)通用.声明
Option Explicit
Public applicationName As Object
'运行的应用软件对象名
Public prevFile As String
'当前应用软件打开的文件名
Dim itmX As ListItem
'ListView中的列数组
Dim startDate As Date '开始时间
Dim endDate As Date '结束时间
Public newSession As Boolean
(2)FORM的Load过程:
Private Sub Form_Load()
newSession = True
End Sub
(3)Timer1.Timer过程:
Private Sub Timer1_Timer()
Dim str As String
Dim doc As Object
On Error Resume Next
Set applicationName = GetObject(,
"Excel.Application") '取得当前运行的Excel对象
Set doc = applicationName.ActiveWorkBook
'当前Excel打开的工作簿文件
Set applicationName = GetObject(,
"Word.Application") '取得当前运行的Word对象
Set doc = applicationName.ActiveDocument
'当前Word的applicationName打开的文件
Set applicationName = GetObject(,
"AutoCAD.Application") '取得当前运行的AutoCAD对象
Set doc = applicationName.ActiveDocument
'当前AutoCAD打开的图挡文件
str = doc.FullName
'当前applicationName打开的文件名(包括路径)
If str = "" Then '当前无上述对象,
则用"无工作文件"命名
str = "无工作文件"
End If
If prevFile = str Then '时间增加
Dim actDate As Date
actDate = Now '
将系统当前的时间给变量actDate
itmX.SubItems(1) = DateDiff("s",
startDate, actDate) '计算开始时间与当前时间的差
Exit Sub '退出子过程
End If
'若当前文件改变
If prevFile <> "" Then
endDate = Now
' 将系统当前的时间给变量endDate
itmX.SubItems(3) = Time '"时间结束",
返回系统当前的时间。
applicationName = 0
End If
prevFile = str
Set itmX = ListView1.ListItems.Add(, , str)
'在ListView中另起一行
itmX.SubItems(2) = Time
'"时间开始",返回系统当前的时间。
startDate = Now
' 将系统当前的时间给变量startDate
End Sub
---- (四) 生成并运行可执行文件:
---- 选菜单的“文件 | 生成vb_time.exe”即可。可退出VB,运行vb_time.exe,该软件运行后自动进行监视,一当您使用了Word(Excel或AutoCAD14)即开始记录,直到该应用软件退出;如桌面上无Word,Excel或AutoCAD14运行,或虽有但尚未打开一个文件,则该软件以“无工作文件”进行记录。有兴趣的读者可以进一步修改,使得程序可以监视更多的应用软件特别是监视游戏软件,同时将记录结果存盘以供以后查询使用。
---- (五) 几个关键函数的说明:
---- (1)DateDiff 函数
---- 语法 DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]]) 返回 Variant (Long) 的值,表示两个指定日期间的时间间隔数目。DateDiff 函数语法中有下列命名参数:
---- interval 必要。字符串表达式,表示用来计算date1 和 date2 的时间差的时间间隔 Date1,date2 必要;Variant (Date)。计算中要用到的两个日期。
---- Firstdayofweek 可选。指定一个星期的第一天的常数。如果未予指定,则以星期日为第一天。
---- firstweekofyear 可选。指定一年的第一周的常数。如未指定,则以包含 1 月 1 日的星期为第一周。
---- interval 参数的设定值如下(我们设置为s即秒):
---- yyyy 年;q 季 ;m 月 ;y 一年的日数 ;d 日 ;w 一周的日数 ;ww 周 ;h 时 ;
---- n 分钟 ;s 秒
---- (2)GetObject 函数
---- 语法 GetObject([pathname] [, class])
---- 返回文件中的 ActiveX 对象的引用。 pathname 可选的,包含待检索对象的文件的全路径和名称。如果省略 pathname,则 class 是必需的。 class 代表该对象的类的字符串;class 参数的语法格式为 appname.objecttype,且语法的各个部分如下:
---- appname 必需的;Variant (String)。提供该对象的应用程序名称(我们用Word)。
---- objecttype 必需的;Variant (String)。待创建对象的类型或类(我们用Application)。
---- 使用 GetObject 函数可以访问文件中的 ActiveX 对象,而且可以将该对象赋给对象变量。可以使用 Set 语句将 GetObject 返回的对象赋给对象变量。例如将Word当前打开的文件对象赋给对象变量word:
---- Dim word As Object
---- Set word = GetObject(, “Word.Application”)
---- 注意:当对象当前已有实例,或要创建已加载的文件的对象时,就使用 GetObject 函数。
---- 如果对象当前还没有实例,或不想启动已加载文件的对象,则应使用 CreateObject 函数。
---- (3)ActiveDocument性质
---- ActiveDocument得到一个Active文挡(active document)的文件对象,语法是: object.ActiveDocument
---- 参数object表示一个应用对象,当进入这个应用对象的ActiveDocument性质,由于应用对象已经被隐含,因此可以省略这个应用对象而使用它的属性与方法。注意:对Excel,不用ActiveDocument而使用ActiveWorkBook。
---- 下面给出从建立该软件的工程项目到最后生成可执行文件的全过程,这个程序的关键是下面的Timer事件(以1000毫秒为周期),它利用了微软的ActiveDocument技术(Active 文挡),使用函数GetObject来获取当前应用软件对象,用函数DateDiff计算时间差,利用微软的“Microsoft Windows Commn Control 5.0”中的控件“ListView”来实现数据显示界面;程序在Win98/NT下可以自动追踪记录使用Word97,Excel97和AutoCAD14的使用情况,具体叙述如下。
---- (一)建立工程(项目)vb_time.vbp:
---- 在C盘建目录:VB_TIME,今后我们将这个软件的文件都放到这个目录里。运行VB6.0,选“文件 | 新建工程”的“标准EXE”,出现窗体后可先将这个工程存盘:选菜单的“文件 | 工程另存为”,先取名“vb_time”存窗体(扩展名:frm),再取名“vb_time”存工程(扩展名:vbp)。
---- (二)增加控件ListView与Timer:
---- 在菜单中选:“工程 | 部件”,出现“部件”对话框后选:Microsoft Comman Control 5.0,这时在控件栏里可以看见一些新增加的控件,其中我们需要将其中的“ListView”控件放入到窗体中;放入该控件后,用鼠标右击窗体中“ListView1”,选“属性”,出现“属性页”对话框,在“通用”部分改变“查看”为3,“外观”为1;在“列首”部分插入4列,分别为:文件,时间,开始时间,结束时间. 将Timer控件放入窗体,并设置其Interval属性为1000(= 1秒)。
---- (三)增加代码:
---- (1)通用.声明
Option Explicit
Public applicationName As Object
'运行的应用软件对象名
Public prevFile As String
'当前应用软件打开的文件名
Dim itmX As ListItem
'ListView中的列数组
Dim startDate As Date '开始时间
Dim endDate As Date '结束时间
Public newSession As Boolean
(2)FORM的Load过程:
Private Sub Form_Load()
newSession = True
End Sub
(3)Timer1.Timer过程:
Private Sub Timer1_Timer()
Dim str As String
Dim doc As Object
On Error Resume Next
Set applicationName = GetObject(,
"Excel.Application") '取得当前运行的Excel对象
Set doc = applicationName.ActiveWorkBook
'当前Excel打开的工作簿文件
Set applicationName = GetObject(,
"Word.Application") '取得当前运行的Word对象
Set doc = applicationName.ActiveDocument
'当前Word的applicationName打开的文件
Set applicationName = GetObject(,
"AutoCAD.Application") '取得当前运行的AutoCAD对象
Set doc = applicationName.ActiveDocument
'当前AutoCAD打开的图挡文件
str = doc.FullName
'当前applicationName打开的文件名(包括路径)
If str = "" Then '当前无上述对象,
则用"无工作文件"命名
str = "无工作文件"
End If
If prevFile = str Then '时间增加
Dim actDate As Date
actDate = Now '
将系统当前的时间给变量actDate
itmX.SubItems(1) = DateDiff("s",
startDate, actDate) '计算开始时间与当前时间的差
Exit Sub '退出子过程
End If
'若当前文件改变
If prevFile <> "" Then
endDate = Now
' 将系统当前的时间给变量endDate
itmX.SubItems(3) = Time '"时间结束",
返回系统当前的时间。
applicationName = 0
End If
prevFile = str
Set itmX = ListView1.ListItems.Add(, , str)
'在ListView中另起一行
itmX.SubItems(2) = Time
'"时间开始",返回系统当前的时间。
startDate = Now
' 将系统当前的时间给变量startDate
End Sub
---- (四) 生成并运行可执行文件:
---- 选菜单的“文件 | 生成vb_time.exe”即可。可退出VB,运行vb_time.exe,该软件运行后自动进行监视,一当您使用了Word(Excel或AutoCAD14)即开始记录,直到该应用软件退出;如桌面上无Word,Excel或AutoCAD14运行,或虽有但尚未打开一个文件,则该软件以“无工作文件”进行记录。有兴趣的读者可以进一步修改,使得程序可以监视更多的应用软件特别是监视游戏软件,同时将记录结果存盘以供以后查询使用。
---- (五) 几个关键函数的说明:
---- (1)DateDiff 函数
---- 语法 DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]]) 返回 Variant (Long) 的值,表示两个指定日期间的时间间隔数目。DateDiff 函数语法中有下列命名参数:
---- interval 必要。字符串表达式,表示用来计算date1 和 date2 的时间差的时间间隔 Date1,date2 必要;Variant (Date)。计算中要用到的两个日期。
---- Firstdayofweek 可选。指定一个星期的第一天的常数。如果未予指定,则以星期日为第一天。
---- firstweekofyear 可选。指定一年的第一周的常数。如未指定,则以包含 1 月 1 日的星期为第一周。
---- interval 参数的设定值如下(我们设置为s即秒):
---- yyyy 年;q 季 ;m 月 ;y 一年的日数 ;d 日 ;w 一周的日数 ;ww 周 ;h 时 ;
---- n 分钟 ;s 秒
---- (2)GetObject 函数
---- 语法 GetObject([pathname] [, class])
---- 返回文件中的 ActiveX 对象的引用。 pathname 可选的,包含待检索对象的文件的全路径和名称。如果省略 pathname,则 class 是必需的。 class 代表该对象的类的字符串;class 参数的语法格式为 appname.objecttype,且语法的各个部分如下:
---- appname 必需的;Variant (String)。提供该对象的应用程序名称(我们用Word)。
---- objecttype 必需的;Variant (String)。待创建对象的类型或类(我们用Application)。
---- 使用 GetObject 函数可以访问文件中的 ActiveX 对象,而且可以将该对象赋给对象变量。可以使用 Set 语句将 GetObject 返回的对象赋给对象变量。例如将Word当前打开的文件对象赋给对象变量word:
---- Dim word As Object
---- Set word = GetObject(, “Word.Application”)
---- 注意:当对象当前已有实例,或要创建已加载的文件的对象时,就使用 GetObject 函数。
---- 如果对象当前还没有实例,或不想启动已加载文件的对象,则应使用 CreateObject 函数。
---- (3)ActiveDocument性质
---- ActiveDocument得到一个Active文挡(active document)的文件对象,语法是: object.ActiveDocument
---- 参数object表示一个应用对象,当进入这个应用对象的ActiveDocument性质,由于应用对象已经被隐含,因此可以省略这个应用对象而使用它的属性与方法。注意:对Excel,不用ActiveDocument而使用ActiveWorkBook。
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比