----實踐中常常期望有一個小軟件,它可以自動追蹤記錄當前應用軟件進行工作的時間和內容,例如:使用Word進行文件編輯排版的時間和文件名稱,使用AutoCAD軟件進行制圖的時間和圖擋名稱,玩某個游戲軟件的時間和游戲軟件的名稱等等。本文討論如何利用VB6.0編程實現這樣的軟件;本文的程序可同時追蹤記錄使用Word,Excel或AutoCAD14打開文件(包括打開網上鄰居中的文件)進行工作的開始時間、結束時間(以秒為單位)和使用的文件名(包括完整路徑)。
----下面給出從建立該軟件的工程項目到最後生成可執行文件的全過程,這個程序的關鍵是下面的Timer事件(以1000毫秒為周期),它利用了微軟的ActiveDocument技術(Active文擋),使用函數GetObject來獲取當前應用軟件對象,用函數DateDiff計算時間差,利用微軟的“MicrosoftWindowsCommnControl5.0”中的控件“ListView”來實現數據顯示界面;程序在Win98/NT下可以自動追蹤記錄使用Word97,Excel97和AutoCAD14的使用情況,具體敘述如下。
----(一)建立工程(項目)vb_time.vbp:
----在C盤建目錄:VB_TIME,今後我們將這個軟件的文件都放到這個目錄裡。運行VB6.0,選“文件|新建工程”的“標准EXE”,出現窗體後可先將這個工程存盤:選菜單的“文件|工程另存為”,先取名“vb_time”存窗體(擴展名:frm),再取名“vb_time”存工程(擴展名:vbp)。
----(二)增加控件ListView與Timer:
----在菜單中選:“工程|部件”,出現“部件”對話框後選:MicrosoftCommanControl5.0,這時在控件欄裡可以看見一些新增加的控件,其中我們需要將其中的“ListView”控件放入到窗體中;放入該控件後,用鼠標右擊窗體中“ListView1”,選“屬性”,出現“屬性頁”對話框,在“通用”部分改變“查看”為3,“外觀”為1;在“列首”部分插入4列,分別為:文件,時間,開始時間,結束時間.將Timer控件放入窗體,並設置其Interval屬性為1000(=1秒)。
----(三)增加代碼:
----(1)通用.聲明
OptionExplicit
PublicapplicationNameAsObject
'運行的應用軟件對象名
PublicprevFileAsString
'當前應用軟件打開的文件名
DimitmXAsListItem
'ListView中的列數組
DimstartDateAsDate'開始時間
DimendDateAsDate'結束時間
PublicnewSessionAsBoolean
(2)FORM的Load過程:
PrivateSubForm_Load()
newSession=True
EndSub
(3)Timer1.Timer過程:
PrivateSubTimer1_Timer()
DimstrAsString
DimdocAsObject
OnErrorResumeNext
SetapplicationName=GetObject(,
"Excel.Application")'取得當前運行的Excel對象
Setdoc=applicationName.ActiveWorkBook
'當前Excel打開的工作簿文件
SetapplicationName=GetObject(,
"Word.Application")'取得當前運行的Word對象
Setdoc=applicationName.ActiveDocument
'當前Word的applicationName打開的文件
SetapplicationName=GetObject(,
"AutoCAD.Application")'取得當前運行的AutoCAD對象
Setdoc=applicationName.ActiveDocument
'當前AutoCAD打開的圖擋文件
str=doc.FullName
'當前applicationName打開的文件名(包括路徑)
Ifstr=""Then'當前無上述對象,
則用"無工作文件"命名
str="無工作文件"
EndIf
IfprevFile=strThen'時間增加
DimactDateAsDate
actDate=Now'
將系統當前的時間給變量actDate
itmX.SubItems(1)=DateDiff("s",
startDate,actDate)'計算開始時間與當前時間的差
ExitSub'退出子過程
EndIf
'若當前文件改變
IfprevFile<>""Then
endDate=Now
'將系統當前的時間給變量endDate
itmX.SubItems(3)=Time'"時間結束",
返回系統當前的時間。
applicationName=0
EndIf
prevFile=str
SetitmX=ListView1.ListItems.Add(,,str)
'在ListView中另起一行
itmX.SubItems(2)=Time
'"時間開始",返回系統當前的時間。
startDate=Now
'將系統當前的時間給變量startDate
EndSub
----(四)生成並運行可執行文件:
----選菜單的“文件|生成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:
----DimwordAsObject
----Setword=GetObject(,“Word.Application”)
----注意:當對象當前已有實例,或要創建已加載的文件的對象時,就使用GetObject函數。
----如果對象當前還沒有實例,或不想啟動已加載文件的對象,則應使用CreateObject函數。
----(3)ActiveDocument性質
----ActiveDocument得到一個Active文擋(activedocument)的文件對象,語法是:object.ActiveDocument
----參數object表示一個應用對象,當進入這個應用對象的ActiveDocument性質,由於應用對象已經被隱含,因此可以省略這個應用對象而使用它的屬性與方法。注意:對Excel,不用ActiveDocument而使用ActiveWorkBook->