明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線(xiàn)學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

Windows下面向任務(wù)欄編程的若干問(wèn)題

[摘要]趙潔 胡德保一. 引言任務(wù)欄是Windows中一個(gè)眾所周知的概念,它指的是Windows桌面上顯示已運(yùn)行程序的一塊條狀區(qū)域。一般來(lái)說(shuō),任務(wù)欄是由三個(gè)部分組成的:最左邊是“開(kāi)始”按鈕,中間是已運(yùn)行程序...
趙潔 胡德保

一. 引言
任務(wù)欄是Windows中一個(gè)眾所周知的概念,它指的是Windows桌面上顯示已運(yùn)行程序的一塊條狀區(qū)域。一般來(lái)說(shuō),任務(wù)欄是由三個(gè)部分組成的:最左邊是“開(kāi)始”按鈕,中間是已運(yùn)行程序的顯示區(qū)域(Windows98還有一個(gè)快捷工具欄),最右邊是任務(wù)欄提示區(qū)域。所謂的任務(wù)欄編程主要指對(duì)任務(wù)欄提示區(qū)進(jìn)行編程。Windows系統(tǒng)允許用戶(hù)在任務(wù)欄提示區(qū)里放置自己的應(yīng)用程序圖標(biāo)并定制自己需要的操作。
在任務(wù)欄提示區(qū)里放置應(yīng)用程序圖標(biāo)一方面方便了用戶(hù)與應(yīng)用程序的交流,另一方面也可使應(yīng)用程序以更形象的形式給用戶(hù)以提示。一般地,將應(yīng)用程序圖標(biāo)放置在任務(wù)欄提示區(qū)中意味著該應(yīng)用程序是一個(gè)后臺(tái)程序。例如在Windows中進(jìn)行后臺(tái)打印時(shí),一個(gè)打印機(jī)圖標(biāo)就會(huì)顯示在任務(wù)欄提示區(qū)中提示用戶(hù)打印機(jī)進(jìn)程正在后臺(tái)運(yùn)行。目前有許多軟件都使用了任務(wù)欄編程技術(shù),如Netants、Go!zilla、金山詞霸等,這一方面是由于這些軟件具有某些“后臺(tái)”性質(zhì),另一方面也是因?yàn)閷?yīng)用程序圖標(biāo)放在任務(wù)欄提示區(qū)中使得人機(jī)交互更為簡(jiǎn)便。
目前有許多編程語(yǔ)言都可以針對(duì)任務(wù)欄進(jìn)行編程,如VC++、Delphi、VB等,也已有一些文章對(duì)其進(jìn)行了介紹。但筆者發(fā)現(xiàn)很少有文章從原理到程序?qū)崿F(xiàn)系統(tǒng)地對(duì)任務(wù)欄編程進(jìn)行論述,大多數(shù)的資料只是給出幾個(gè)API函數(shù)聲明和一段代碼。但任務(wù)欄編程不僅涉及到API,還涉及回調(diào)函數(shù)等一些更為復(fù)雜的問(wèn)題,因此有必要深入系統(tǒng)地對(duì)該問(wèn)題進(jìn)行探討。
二. 任務(wù)欄編程的實(shí)現(xiàn)技術(shù)
Windows任務(wù)欄編程的基本思路是:(1)通過(guò)API函數(shù)調(diào)用在應(yīng)用程序啟動(dòng)時(shí)將應(yīng)用程序圖標(biāo)放入任務(wù)欄提示區(qū),在程序運(yùn)行時(shí)修改圖標(biāo)特性,并在應(yīng)用程序關(guān)閉時(shí)將圖標(biāo)從任務(wù)欄中刪去;(2)通過(guò)使用回調(diào)函數(shù)控制應(yīng)用程序。本節(jié)主要探討通過(guò)API來(lái)控制圖標(biāo)的一些問(wèn)題。下一節(jié)將主要探討回調(diào)函數(shù)。
1. Shell_NotifyIcon函數(shù)
其聲明為: Private Declare Function Shell_NotifyIconLib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long,pnid As NOTIFYICONDATA) As Long
該函數(shù)給系統(tǒng)發(fā)送添加、修改、刪除任務(wù)欄提示區(qū)圖標(biāo)的消息,系統(tǒng)根據(jù)發(fā)送的消息進(jìn)行相應(yīng)的處理?梢哉f(shuō)該函數(shù)是任務(wù)欄提示區(qū)編程的核心,掌握它就可以輕松地編寫(xiě)出符合要求的程序來(lái)。該函數(shù)中的參數(shù)意義如下:
(1) 參數(shù)dwMessage (ByVal dwMessage As Long)
該參數(shù)通知系統(tǒng)進(jìn)行何種操作,取值如下:
NIM_ADD
添加圖標(biāo)到任務(wù)欄提示區(qū)
NIM_DELETE
刪除圖標(biāo)
NIM_MODIFY
發(fā)送圖標(biāo)特性已改變的消息
(2) 參數(shù)pnid (pnid As NOTIFYICONDATA)
存儲(chǔ)圖標(biāo)特性數(shù)據(jù),NOTIFYICONDATA定義如下:
Private Type NOTIFYICONDATA
CbSize As Long '該數(shù)據(jù)結(jié)構(gòu)的大小
hWnd As Long '處理圖標(biāo)通知消息的窗口句柄
uID As Long '應(yīng)用程序自定義的圖標(biāo)ID
uFlags As Long '用來(lái)設(shè)置uCallbackMessage、hIcon、szTip等三個(gè)欄目是否有效,一般取組合NIF_ICON Or NIF_TIP Or NIF_MESSAGE,表示全部有效
uCallbackMessage As Long '消息編號(hào),將來(lái)當(dāng)使用者在圖標(biāo)上按下鼠標(biāo)時(shí)就會(huì)以消息通知消息處理回調(diào)函數(shù)
hIcon As Long '圖標(biāo)句柄
szTip As String*64 '提示消息
End Type
2.加入圖標(biāo)
在啟動(dòng)窗體的Form_Load()事件中加入以下代碼就可以在程序運(yùn)行時(shí)在任務(wù)欄提示區(qū)中添加一個(gè)圖標(biāo):
Dim nid As NOTIFYICONDATA
nid.cbSize = Len(nid)
nid.hwnd = Me.hwnd
nid.uID = 9998
nid.uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE
nid.hIcon = Me.Icon
nid.uCallbackMessage = WM_USER+100
nid.szTip ="歡迎使用任務(wù)欄"
Shell_NotifyIcon NIM_ADD, nid ' 
3.刪除圖標(biāo)
在Form_Unload()事件中添加以下代碼在程序關(guān)閉時(shí)刪除圖標(biāo),要注意的是這里所使用到的uID和hWnd必須和當(dāng)初加入圖標(biāo)時(shí)所使用的uID和hWnd完全一致。
Dim nid As NOTIFYICONDATA
nid.cbSize = Len(nid)
nid.hwnd = Me.hwnd
nid.uID = 9998
Shell_NotifyIcon NIM_DELETE, nid
4.修改圖標(biāo)
下面一段代碼實(shí)現(xiàn)圖標(biāo)的修改。這里的uId和hWnd也必須和當(dāng)初加入圖標(biāo)時(shí)所使用的 uId和hWnd完全一致。同時(shí)還必須正確設(shè)置uFlags和hIcon。uFlags必須設(shè)置為NIF_ICON,表示修改對(duì)圖標(biāo)有效;hIcon應(yīng)設(shè)為新圖標(biāo)。
Dim nid As NOTIFYICONDATA
nid.cbSize = Len(nid)
nid.hWnd = Me.hWnd
nid.uID = 9999
nid.uFlags = NIF_ICON
nid.hIcon = Image1.Picture
Shell_NotifyIcon NIM_MODIFY, nid
修改提示消息和消息編號(hào)的方法與此類(lèi)似。不同點(diǎn)是當(dāng)修改提示消息時(shí)須將uFlags設(shè)為NIF_TIP,修改消息編號(hào)時(shí)須將uFlags設(shè)為NIF_MESSAGE。
三. 回調(diào)函數(shù)
在前面已經(jīng)講到,當(dāng)用戶(hù)在圖標(biāo)上按下鼠標(biāo)時(shí),系統(tǒng)將接收并傳遞消息給窗口消息處理回調(diào)函數(shù)進(jìn)行具體的處理。用戶(hù)可以在回調(diào)函數(shù)中對(duì)不同的消息進(jìn)行不同的程序處理來(lái)定制自己的應(yīng)用程序的功能(例如鼠標(biāo)左擊時(shí)彈出一個(gè)菜單,鼠標(biāo)右擊時(shí)彈出另一個(gè)菜單,鼠標(biāo)雙擊時(shí)顯示主窗口等等)。在任務(wù)欄提示區(qū)中加入圖標(biāo)時(shí)設(shè)置的消息編號(hào)uMessage就是用來(lái)告訴回調(diào)函數(shù)此消息來(lái)自圖標(biāo)對(duì)應(yīng)的程序,回調(diào)函數(shù)即可據(jù)此進(jìn)行處理;卣{(diào)函數(shù)是個(gè)比較復(fù)雜的問(wèn)題,下面從VB程序的運(yùn)行機(jī)制入手來(lái)具體闡述任務(wù)欄編程中回調(diào)函數(shù)的實(shí)現(xiàn)方法。
1. VB應(yīng)用程序的運(yùn)行機(jī)制
VB應(yīng)用程序的運(yùn)行是基于Windows的消息傳遞機(jī)制的。Windows的工作方式是一種多任務(wù)多線(xiàn)程的工作方式,VB程序運(yùn)行時(shí)是受Windows控制的。具體講,一個(gè)VB程序運(yùn)行時(shí)Windows的進(jìn)程管理模塊就會(huì)給它創(chuàng)建一個(gè)進(jìn)程。進(jìn)程與Windows之間的通訊是通過(guò)消息傳遞來(lái)實(shí)現(xiàn)的:進(jìn)程發(fā)送一個(gè)消息給Windows并等待,Windows處理完此消息后將結(jié)果會(huì)傳給進(jìn)程。由于Windows支持多線(xiàn)程,因此一個(gè)進(jìn)程可以在內(nèi)部創(chuàng)建多個(gè)線(xiàn)程,這些線(xiàn)程共享此進(jìn)程的地址空間、全局變量、文件以及各種信號(hào)。除了共享地址空間外,各個(gè)線(xiàn)程是獨(dú)立的,每個(gè)線(xiàn)程有自己的程序計(jì)數(shù)器、堆棧、寄存器及狀態(tài)(等待、就緒、運(yùn)行)。VB程序在運(yùn)行時(shí),通過(guò)對(duì)其所含的每個(gè)控件都創(chuàng)建一個(gè)線(xiàn)程來(lái)并行地處理控件的事件。一個(gè)控件在進(jìn)程內(nèi)對(duì)應(yīng)一個(gè)線(xiàn)程。這些線(xiàn)程也同樣通過(guò)消息與Windows進(jìn)行通訊。Windows為運(yùn)行于其上的應(yīng)用程序提供了確省的消息處理程序。例如在一個(gè)VB程序運(yùn)行時(shí),右擊一個(gè)文本框就會(huì)彈出一個(gè)包含“剪切”、“復(fù)制”、“粘貼”等功能的快捷菜單,這就是由Windows的確省消息處理程序來(lái)完成的。Windows系統(tǒng)允許用戶(hù)截獲應(yīng)用程序窗口的消息并用自定義的過(guò)程來(lái)加以處理。這個(gè)自定義的過(guò)程稱(chēng)為“回調(diào)”函數(shù),用戶(hù)可在回調(diào)函數(shù)中對(duì)感興趣的消息進(jìn)行適當(dāng)?shù)奶幚,并將其它的消息交給系統(tǒng)原來(lái)的消息處理過(guò)程處理。這種“替代”似乎很困難,但實(shí)際上卻是完全可以實(shí)現(xiàn)的。
2. 用回調(diào)函數(shù)來(lái)處理任務(wù)欄提示區(qū)的消息
回調(diào)函數(shù)(Callback Function)是應(yīng)用程序提供給Windows系統(tǒng)DLL或其它DLL調(diào)用的函數(shù),一般用于截獲消息、獲取系統(tǒng)信息或處理異步事件。應(yīng)用程序把回調(diào)函數(shù)的地址指針告訴DLL,而DLL在適當(dāng)?shù)臅r(shí)候會(huì)調(diào)用該函數(shù);卣{(diào)函數(shù)必須遵守事先規(guī)定好的參數(shù)格式和傳遞方式,否則DLL一調(diào)用它就會(huì)引起程序或系統(tǒng)的崩潰。
通常情況下,回調(diào)函數(shù)采用標(biāo)準(zhǔn)Windows API的調(diào)用方式,即_stdcall,當(dāng)然,DLL編制者可以自已定義調(diào)用方式,但客戶(hù)程序也必須遵守相同的規(guī)定。在_stdcall方式下,函數(shù)的參數(shù)按從右到左的順序壓入堆棧,除了明確指明是指針或引用外,參數(shù)都按值傳遞,函數(shù)返回之前自己負(fù)責(zé)把參數(shù)從堆棧中彈出。
將應(yīng)用程序圖標(biāo)放入任務(wù)欄提示區(qū)后,如果用戶(hù)要想打開(kāi)該應(yīng)用程序窗口,必須到任務(wù)欄提示區(qū)中去點(diǎn)擊圖標(biāo)。但這并不意味著用戶(hù)點(diǎn)擊后,窗口就會(huì)自動(dòng)顯示出來(lái)。每當(dāng)用戶(hù)點(diǎn)擊圖標(biāo),系統(tǒng)會(huì)以消息方式通知窗口的消息處理回調(diào)函數(shù),所以只要在應(yīng)用程序窗口的回調(diào)函數(shù)中進(jìn)行適當(dāng)?shù)木幊叹涂梢詫?shí)現(xiàn)。
窗口消息回調(diào)函數(shù)的格式如下所示:
Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
因?yàn)榛卣{(diào)函數(shù)是自定義的函數(shù),因此函數(shù)名和參數(shù)名都可以自定義。各參數(shù)的含義如下表所示:
hWnd
窗口句柄
Msg
等于當(dāng)初調(diào)用Shell_NotifyIcon時(shí)所設(shè)置的uCallbackMessage的值
wParam
等于當(dāng)初調(diào)用Shell_NotifyIcon時(shí)所設(shè)置的uID的值
lParam
等于鼠標(biāo)消息,例如WM_LBUTTONDOWN(按下鼠標(biāo)左鍵)等
在VB使用回調(diào)函數(shù)存在不少限制:1、回調(diào)函數(shù)必須放到標(biāo)準(zhǔn)的模塊(Module)中,而不能放在類(lèi)模塊或窗體代碼中;2、AddressOf運(yùn)算符只能用于自定義的過(guò)程、函數(shù)或?qū)傩裕荒軐⑵溆糜贒eclare語(yǔ)句聲明的外部函數(shù),也不能用于類(lèi)型庫(kù)中的函數(shù);3、寫(xiě)在AddressOf后面的過(guò)程、函數(shù)和屬性必須與有關(guān)的聲明和過(guò)程在同一個(gè)工程中;4、由于回調(diào)函數(shù)要與系統(tǒng)直接交互,所以調(diào)試十分困難,如果回調(diào)函數(shù)中有錯(cuò)誤,可能會(huì)引起非法操作,致使VB運(yùn)行環(huán)境崩潰。
在VB中用回調(diào)函數(shù)處理任務(wù)欄提示區(qū)消息的具體步驟如下:
(1)在啟動(dòng)窗體的Form_Load()事件中加入以下代碼。
prevWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) '獲取系統(tǒng)確省的窗口消息處理函數(shù)句柄
SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf WndProc '指定WndProc為新的消息處理函數(shù)
'加入圖標(biāo)
Dim nid As NOTIFYICONDATA
nid.cbSize = Len(nid)
nid.hwnd = Me.hwnd
nid.uID = 9998
nid.uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE
nid.hIcon = Me.Icon
nid.uCallbackMessage = WM_USER + 100 '定義消息編號(hào)
Shell_NotifyIcon NIM_ADD, nid ' 
(2)在模塊中加入回調(diào)函數(shù)WndProc的代碼
Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_USER + 100 Then ''該消息等于調(diào)用Shell_NotifyIcon時(shí)定義的uCallbackMessage
If lParam = WM_LBUTTONDOWN Or lParam = WM_RBUTTONDOWN Then
'當(dāng)按下鼠標(biāo)左鍵或右鍵時(shí)彈出菜單
frmCaution.PopupMenu frmCaution.mnuaa
End If
End If
'其它的消息交給系統(tǒng)處理,prevWndProc為原來(lái)的窗口消息處理函數(shù)的句柄
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
End Function
執(zhí)行以上的代碼時(shí),API函數(shù)GetWindowLong()、SetWindowLong()和CallWindowProc()的聲明需要先加入到模塊中,這些聲明可通過(guò)VB所帶的“API文本瀏覽器”獲得。
四. 實(shí)例分析:一個(gè)定時(shí)音樂(lè)提醒程序
對(duì)于一個(gè)從事計(jì)算機(jī)工作的人來(lái)說(shuō),長(zhǎng)時(shí)間坐在計(jì)算機(jī)前面工作是常有的事。持續(xù)的屏幕注視往往使得眼睛十分疲勞。最好是能每隔一段時(shí)間休息一下。但計(jì)算機(jī)工作尤其是編程往往會(huì)使人全神貫注,忘記了時(shí)間。我們可以設(shè)計(jì)一個(gè)定時(shí)音樂(lè)提醒程序,讓它每隔一段時(shí)間就自動(dòng)提醒自己休息一會(huì)兒。
下面就結(jié)合前述的任務(wù)欄編程思想給出具體的程序?qū)崿F(xiàn)。該程序具有每隔一段時(shí)間就播放一段音樂(lè)提醒和到某個(gè)特定時(shí)刻播放音樂(lè)提醒的功能,并可以由用戶(hù)自定義提醒時(shí)間、提醒內(nèi)容以及音效。
1、新建一個(gè)工程,并加入五個(gè)窗體,分別命名為frmCaution、frmTipMess、frmSound、frmChangTime和frmAbout 。其中frmcaution為顯示提醒消息的啟動(dòng)窗體,frmtipmess為用戶(hù)自定義提醒內(nèi)容的窗體,frmsound為用戶(hù)自定義提醒聲音的窗體,frmchangtime為用戶(hù)自定義提醒時(shí)間方式的窗體,frmabout為“關(guān)于”信息顯示窗體。
2、在frmcaution上加入一個(gè)菜單“mnuaa”,在“mnuaa”下加入菜單“設(shè)置提醒時(shí)間……”、“設(shè)置提醒消息……”、“音效……”、“關(guān)于……”、“退出”。菜單“mnuaa”就作為當(dāng)單擊圖標(biāo)時(shí)的彈出菜單。在frmcaution中加入一個(gè)panel,命名為“pnlmessage”,用于顯示消息。在frmcaution中加入一個(gè)多媒體控件,命名為“mm”,用于播放音樂(lè)。在frmcaution中加入一個(gè)時(shí)間控件“Time1”。
3、在工程中加入一個(gè)標(biāo)準(zhǔn)模塊mdlCommon,并在其中放置如下代碼:
'API函數(shù)聲明
Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Public prevWndProc As Long '原有的窗口消息處理函數(shù)
Public Message As String '消息內(nèi)容
Public TipInterval As Integer '提示時(shí)間間隔
Public TipTime As String '提示時(shí)間
Public Time As Integer '累計(jì)時(shí)間

Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_USER + 100 Then
If lParam = WM_LBUTTONDOWN Or lParam = WM_RBUTTONDOWN Then
'當(dāng)按下鼠標(biāo)左鍵或右鍵時(shí)彈出菜單
frmCaution.PopupMenu frmCaution.mnuaa
End If
End If
'其它的消息交給系統(tǒng)處理,prevWndProc為原來(lái)的窗口消息處理函數(shù)的句柄
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
End Function
以上程序限于篇幅略去了數(shù)據(jù)結(jié)構(gòu)和常量的定義。該定義可從“API文本瀏覽器”中獲得。
4、編寫(xiě)frmcaution的Form_Load()過(guò)程。
Private Sub Form_Load()
Load frmSound
prevWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) '獲取系統(tǒng)確省的窗口消息處理函數(shù)句柄
SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf WndProc '指定WndProc為新的消息處理函數(shù)
'加入圖標(biāo)
Dim nid As NOTIFYICONDATA
nid.cbSize = Len(nid)
nid.hwnd = Me.hwnd
nid.uID = 9998
nid.uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE
nid.hIcon = Me.Icon
nid.uCallbackMessage = WM_USER + 100 '定義消息編號(hào)
Shell_NotifyIcon NIM_ADD, nid
'設(shè)置顯示界面
pnlMessage.Left = (Me.ScaleWidth - pnlMessage.Width) / 2
pnlMessage.Top = (Me.ScaleHeight - pnlMessage.Height) / 2
TipInterval = 30 '提醒時(shí)間間隔默認(rèn)為30分鐘
TipTime = "" '提醒時(shí)間默認(rèn)為空
Time = 0
Message = "親愛(ài)的主人,建議您先休息5分鐘!"
mm.Filename = frmSound!filSound.List(0)
End Sub
5、編寫(xiě)frmcaution的Form_Unload()過(guò)程。
Private Sub Form_Unload(Cancel As Integer)
Dim nid As NOTIFYICONDATA
'恢復(fù)原來(lái)的窗口消息處理函數(shù)
SetWindowLong Me.hwnd, GWL_WNDPROC, prevWndProc
'刪除圖標(biāo)
nid.cbSize = Len(nid)
nid.hwnd = Me.hwnd
nid.uID = uID
Shell_NotifyIcon NIM_DELETE, nid
mm.Command = "close"
End Sub
6、編寫(xiě)Timer1_Timer()過(guò)程。
Private Sub Timer1_Timer()
If TipInterval <> 0 Then '若設(shè)置了提醒間隔
Time = Time + 1 '累計(jì)時(shí)間加1秒
If Time >= TipInterval * 60 Then '提醒時(shí)間間隔已到
pnlMessage.Caption = Message
Timer1.Enabled = False
mm.Filename = mm.Filename
mm.Command = "open"
mm.Command = "play"
Time = 0
frmCaution.Show
'窗口總顯示在最前
SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
End If
End If
If TipTime <> "" Then '若設(shè)置了定時(shí)
Dim NowTime As Date
Dim DestTime As Date
NowTime = Format(Now(), "hh:nn:ss")
DestTime = Format(TipTime, "hh:nn:ss")
If NowTime = DestTime Then '定時(shí)時(shí)間已到
pnlMessage.Caption = Message
Timer1.Enabled = False
mm.Filename = mm.Filename
mm.Command = "open"
mm.Command = "play"
frmCaution.Show
SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
End If
End If
End Sub

以上就給出了定時(shí)音樂(lè)提醒程序的大致過(guò)程。該程序運(yùn)行時(shí),確省情況下每隔30分鐘就會(huì)跳出一個(gè)提醒窗口,同時(shí)播放一段音樂(lè)。當(dāng)用戶(hù)單擊任務(wù)欄提示區(qū)中的圖標(biāo)就會(huì)彈出一個(gè)菜單,然后用戶(hù)可以選擇需要執(zhí)行的功能。該程序的一些其它功能如“設(shè)置提醒時(shí)間形式”、“設(shè)置音效”等因與本文主題沒(méi)多少聯(lián)系在此不再細(xì)述。
定時(shí)音樂(lè)提醒程序在Microsoft Visual Basic 6.0中文企業(yè)版、Windows98環(huán)境下調(diào)試通過(guò)。讀者若需要完整的源程序請(qǐng)E-mail Martinet@sohu.com與筆者聯(lián)系。