如果你下載(源程序下載)并運行這個例程序,你會發(fā)現(xiàn)如果我們在托盤圖標上點擊鼠標右鍵,則會彈出一個右鍵菜單。如果點擊相應(yīng)的菜單項,程序主窗體會隨之變化,這樣就可以控制程序的行為。而如果當主窗體處于最小化狀態(tài)時,我們在托盤圖標上點擊左鍵,窗體會恢復(fù)到原來的大小。其實實現(xiàn)上述的功能都要依賴于WINDOWS操作系統(tǒng)的消息機制,要完全弄懂這個機制挺不容易的,但是我們可以按下述文字來理解它。
把WINDOWS操作系統(tǒng)看作人的大腦,它接收、處理、并發(fā)送各種各樣的信息給我們的各個器官(當然是比喻各個應(yīng)用程序了),也就是說它是消息的中樞。而每個應(yīng)用程序(甚至每一個按鈕、標簽、窗體等等統(tǒng)稱為窗口)在運行時都會被分配一個窗口過程WINDOWPROC,由這個窗口過程來接收和處理操作系統(tǒng)發(fā)來的消息(實際上存在一個消息隊列),通常情況下這個窗口過程是由操作系統(tǒng)指定的,它會自動的響應(yīng)并處理一些WINDOWS消息(如窗體移動、最大化、最小化、錯誤信息等)。好,到這我們先停一下,提出一個疑問,這些消息能否由我們自己寫程序來處理呢?答案是肯定的,不過還得借助API函數(shù)的威力了,怎么用?我們還是先看看這些API函數(shù)的定義和參數(shù)吧。
程序中用到了SendMessage、CallWindowProc、SetWindowLong等API函數(shù),其中SendMessage函數(shù)的作用是將一條消息發(fā)給某個窗口;CallWindowProc函數(shù)用來發(fā)送消息到一個窗口過程;而使用SetWindowLong函數(shù)來為窗口結(jié)構(gòu)中為指定的窗口設(shè)置屬性。使用API函數(shù)之前必須先在程序中聲明如下:
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 SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal HWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal HWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long |
其中各參數(shù)的意義如下表:
CallWindowProc函數(shù)
參數(shù) |
意義 |
lpPrevWndFunc |
Long,原來的窗口過程地址 |
HWnd |
Long,窗口句柄 |
Msg |
Long,發(fā)送的消息 |
wParam |
Long,消息類型,參考wParam參數(shù)表 |
lParam |
Long,依據(jù)wParam參數(shù)的不同而不同 |
返回值 Long,依據(jù)發(fā)送的消息不同而變化
SetWindowLong函數(shù) :
參數(shù) |
意義 |
hwnd |
Long,欲為其取得信息的窗口的句柄 |
nIndex |
Long,請參考GetWindowLong函數(shù)的nIndex參數(shù)的說明 |
dwNewLong |
Long,由nIndex指定的窗口信息的新值 |
返回值 Long,指定數(shù)據(jù)的前一個值
SendMessage函數(shù) :
參數(shù) |
意義 |
hwnd |
Long,要接收消息的那個窗口的句柄 |
wMsg |
Long,消息的標識符 |
wParam |
Long,具體取決于消息 |
lParam |
Any,具體取決于消息 |
返回值 Long,由具體的消息決定
VB托盤程序詳解(1)[轉(zhuǎn)載]VB托盤程序詳解(2)[轉(zhuǎn)載]VB托盤程序詳解(3)[轉(zhuǎn)載]VB托盤程序詳解(4)[轉(zhuǎn)載]VB托盤程序詳解(5)[轉(zhuǎn)載]