趙汝苓
【摘要】 通過調用API函數實現系統托盤技術,主要涉及到API的幾個常用函數的聲明和調用,再結合VB本身的特征綜合運用。
【關鍵詞】 API 系統托盤 消息機制
系統托盤常指Windows任務欄的狀態區域,系統時鐘、音量控制等程序都在系統托盤中,一些應用程序在安裝完后也將它們本身的圖標放入了其中。一般來說,系統托盤駐留程序是在計算機后臺運行,如瑞星、MSN等。系統托盤主要以特殊的小圖標在任務欄右邊時間的區域出現,作為程序運行的一個標志,我們可以通過使用小圖標所彈出的菜單來控制應用程序狀態,可實現修改該圖標、窗口復位、最大化、最小化及關閉程序等功能。
利用VB調用API可以實現功能比較完整的托盤程序,牽涉到Shell_NotifyIcon、SendMassage、CallWindowProc、SetWindowLong等API函數,其中Shell_NotifyIcon是主要的函數,它用來添加、刪除、更改系統托盤區的圖標,SendMassage、CallWindowProc、SetWindowLong函數,通過WINDOWS操作系統的消息機制,實現對應用程序的控制。
一、先介紹相關的API函數、關鍵字
1、Shell_NotifyIcon用于添加、刪除、更改系統托盤區的圖標;2、SendMassage用于將一條消息發給某個窗口;3、CallWindowProc用于發送消息到一個窗口過程;4、SetWindowLong用于使窗口結構中為指定的窗口設置屬性,SetWindowLong函數作用是取得默認窗口過程的地址,然后轉向自定義的窗口過程的地址。5、消息機制。Windows消息控制中心一般是三層結構,其頂端就是Windows內核。Windows內核維護著一個消息隊列,第二季控制中心從這個消息隊列中獲取自己管轄的消息,后作出處理,有些消息直接處理掉,有些還要發送給下一級窗體或控件。第二級控制中心一般是各Windows應用程序的Application對象。第三級控制中心就是Windows窗體對象,每一個窗體都有一個默認的窗體過程,這個過程負責處理各種接收到的消息。
二、系統托盤圖標屬性設置
在使用Shell_NotifyIcon函數之前,我們應先定義結構類型NOTIFYICONDATA,然后定義一個NOTIFYICONDATA 的變量TheData來記錄設置托盤圖標的數據。
代碼:
Public Type NOTIFYICONDATA
cbSize As Long HWnd As Long
Uid As Long UFlags As Long
UCallbackMessage As Long
HIcon As Long
SzTip As String*64
End Type
Private TheData As NOTIFYCONDATA
1、設置添加圖標屬性值
代碼:With TheData
Uid=0
.HWnd=frm.HWnd frm.HWnd是程序主窗體的句柄
.cbSize=Len(TheData)\
.HIcon=frm.Icon.Handle frm.Icon.Handle指向主窗體的圖標
.UFlags=NIF_ICON
.UCallbackMessage=TRAY_CALLBACK 作用是允許返回消息
.UFlags=.UFlags Or NIF_MESSAGE
.cbSize=Len(TheData)
End With
Shell_NotifyIcon NIM_ADD,TheData 根據前面定義NIM_ADD,設置為“添加模式”,然后添加。
2、設置刪除圖標屬性值
代碼:
With TheData
.UFlags=0
End With
Shell_NotifyIcon NIM_DELETE,TheData 根據前面定義NIM_DELETE,設置為“刪除模式”。
3、設置更改圖標屬性值
With TheData
.HIcon=pic.Handle tip是字符串string,存儲提示信息
.UFlags=NIF_ICON 指明要對浮動提示進行設置
End With
Shell_NotifyIcon NIM_MODIFY,TheData 根據前面定義NIM_MODIFY,設置為“更改模式”
4、設置為圖標添加浮動提示信息的屬性值
代碼:
With TheData
.SzTip=tip&vbNullChar tip是字符串string,存儲提示信息
.UFlags=NIF_TIP 指明要對浮動提示進行設置
End With
Shell_NotifyIcon NIM_MODIFY,TheData 根據前面定義
NIM_MODIFY,設置為“修改模式”。
此時的托盤圖標是孤立的,我們并不能利用它來控制應用程序的行為。
三、利用消息機制實現托盤圖標控制
每個應用程序在運行時都會被分配一個窗口過程WINDOWPROC,由這個窗口過程來接受和處理操作系統發來的消息,通常情況下這個窗口過程是由操作系統指定的,它會自動的響應并處理一些WINDOWS消息。程序中用到了SendMassage、CallWindowProc、SetWindowLong等API函數,其中SendMassage函數的作用是將一條消息發給某個窗口;CallWindowPro函數用來發送消息到一個窗口過程;而使用SetWindowLong函數來為窗口結構中為指定的窗口設置屬性。
1、處理來自托盤圖標的信息。需要編寫代碼來處理消息,必須先更改窗口的屬性,從原來有默認的窗口過程處理消息變成由自定義編寫的消息處理過程來處理消息。使用SetWindowLong函數來取得默認窗口過程的地址,然后轉向自定義的窗口過程的地址。然后,編寫NewWindowProc函數代碼,需要注意的是TRAY_CALLBACK是由托盤區圖標傳來的消息,要讓托盤圖標傳回消息,必須在添加托盤圖標時指定。
2、實現對圖標右鍵菜單的控制。這時我們需要用到SendMassage函數來向主窗體發送最大化、最小化、關閉、移動等信息,其中HWnd是主窗體的句柄,WM_ SYSCOMMAND表示發送的是系統控制類的消息,SC_ MOVE、SC_SIZE、SC_RESTORE是要發送的消息。
小結:Windows環境提供有非常豐富的編程接口資源,在這個基礎上可以編制出能滿足各種目標功能的應用系統。當然必須對Windows的一種重要運行機制——消息機制作深入的理解,然后才能運用API函數來達到各種要求,系統托盤技術只是其中的一個運用,在此起到了拋磚引玉的作用。
參 考 文 獻
[1]劉新民,蔡瓊編著,《VisualBasic6.0程序設計》,清華大學出版社,2014,3
[2]肖斌編著,《VisualBasic6.0程序設計》,北京希望電子出版社,2012,8