在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細頁面

用VB開發(fā)托盤程序

用VB開發(fā)托盤程序

更新時間:2019-11-23 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

很多軟件運行時會在系統(tǒng)托盤區(qū)(就是桌面右下角顯示時間的區(qū)域)出現(xiàn)一個小圖標,它作為程序運行的一個標志,我們可以通過使用小圖標所彈出的菜單來控制應(yīng)用程序的狀態(tài)。本例就給出了一個功能比較完整的托盤程序,我們可以看到怎樣用API函數(shù)Shell_NotifyIcon來添加、刪除、更改托盤圖標;而且例中還演示了為托盤圖標添加右鍵菜單和浮動提示的方法。

  程序(附后)用到了Shell_NotifyIcon、SendMessage、CallWindowProc、SetWindowLong等API函數(shù),其中Shell_NotifyIcon是主要的函數(shù),它用來添加、刪除、更改系統(tǒng)托盤區(qū)(taskbar status area)的圖標,所以我們先來看看這個函數(shù)的聲明和參數(shù):

  使用API函數(shù)之前必須先在程序中聲明如下:

Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

  
  其中各參數(shù)的意義如下表:

參數(shù): 意義
dwMessage 為消息設(shè)置值,它可以是以下的幾個常數(shù)值:0、1、2
NIM_ADD = 0  加入圖標到系統(tǒng)狀態(tài)欄中
NIM_MODIFY = 1  修改系統(tǒng)狀態(tài)欄中的圖標
NIM_DELETE = 2  刪除系統(tǒng)狀態(tài)欄中的圖標


LpData 用以傳入NOTIFYICONDATA數(shù)據(jù)結(jié)構(gòu)變量,其結(jié)構(gòu)如下所示:

Type NOTIFYICONDATA

  cbSize As Long        需填入NOTIFYICONDATA數(shù)據(jù)結(jié)構(gòu)的長度
  HWnd As Long         設(shè)置成窗口的句柄
  Uid As Long         為圖標所設(shè)置的ID值
  UFlags As Long        設(shè)置uCallbackMessage,hIcon,szTip是否有效
  UCallbackMessage As Long   消息編號
  HIcon As Long         顯示在狀態(tài)欄上的圖標
  SzTip As String * 64     提示信息
End Type

  返回值 Long,非零表示成功,零表示失敗

  在使用這個API函數(shù)之前我們應(yīng)該先定義結(jié)構(gòu)類型NOTIFYICONDATA:

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  

  然后定義一個NOTIFYICONDATA的變量TheData來記錄設(shè)置托盤圖標的數(shù)據(jù)

Private TheData As NOTIFYICONDATA

這時我們就可以使用這個函數(shù)來設(shè)置系統(tǒng)托盤圖標了,具體方法如下:

   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
     '作用是允許返回消息,在下一節(jié)中會有詳細解釋。
    .UFlags = .UFlags Or NIF_MESSAGE
    .cbSize = Len(TheData)
   End With
   Shell_NotifyIcon NIM_ADD, TheData  
  '根據(jù)前面定義NIM_ADD,設(shè)置為“添加模式”,然后添加
   

   2、刪去圖標

With TheData
    .UFlags = 0
End With
Shell_NotifyIcon NIM_DELETE, TheData  
'根據(jù)前面定義NIM_DELETE,設(shè)置為“刪除模式”
   
   3、更改圖標

With TheData
  .HIcon = pic.Handle    
  'pic是圖片狂PictureBox,存放圖標文件
  .UFlags = NIF_ICON
End With
Shell_NotifyIcon NIM_MODIFY, TheData 
'根據(jù)前面定義NIM_MODIFY,設(shè)置為“更改模式”
   
   4、為圖標添加浮動提示信息

With TheData
    .SzTip = tip & vbNullChar 
      'tip是字符串string,存儲提示信息
    .UFlags = NIF_TIP   
    '指明要對浮動提示進行設(shè)置
End With
Shell_NotifyIcon NIM_MODIFY, TheData 
'根據(jù)前面定義NIM_MODIFY,設(shè)置為“修改模式”  
   

  通過以上幾段代碼我們就能根據(jù)自己需要添加、刪除、更改系統(tǒng)托盤圖標,并能添加系統(tǒng)圖標上的浮動提示信息。但這時的托盤圖標是孤立的,我們并不能利用它來控制應(yīng)用程序的行為,怎么辦呢?別急,請往下看……

   如果你下載(源程序下載)并運行這個例程序,你會發(fā)現(xiàn)如果我們在托盤圖標上點擊鼠標右鍵,則會彈出一個右鍵菜單。如果點擊相應(yīng)的菜單項,程序主窗體會隨之變化,這樣就可以控制程序的行為。而如果當(dāng)主窗體處于最小化狀態(tài)時,我們在托盤圖標上點擊左鍵,窗體會恢復(fù)到原來的大小。其實實現(xiàn)上述的功能都要依賴于WINDOWS操作系統(tǒng)的消息機制,要完全弄懂這個機制挺不容易的,但是我們可以按下述文字來理解它。

  把WINDOWS操作系統(tǒng)看作人的大腦,它接收、處理、并發(fā)送各種各樣的信息給我們的各個器官(當(dāng)然是比喻各個應(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ù) TD>意義
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,由具體的消息決定

   我們要自己寫程序來處理消息,必須先更改窗口的屬性,從原來由默認的窗口過程來處理消息變成由我們自己寫的消息處理過程來處理消息。方法是使用SetWindowLong函數(shù)來取得默認窗口過程的地址,然后轉(zhuǎn)向為我們自己寫的窗口過程的地址,具體的實現(xiàn)方法如下代碼:

'GWL_WNDPROC獲得該窗口的窗口過程的地址,AddressOf是取址函數(shù),NewWindowProc是我們寫的過程
OldWindowProc = SetWindowLong(frm.HWnd, GWL_WNDPROC, AddressOf
               NewWindowProc)
 
  然后在NewWindowProc函數(shù)中寫入如下代碼,需要注意的是下面代碼中紅色的TRAY_CALLBACK是由托盤區(qū)圖標傳來的消息,要讓托盤圖標傳回消息,必須在添加托盤圖標時指定:

   Public Function NewWindowProc(ByVal HWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   '如果用戶點擊了托盤中的圖標,則進行判斷是點擊了左鍵還是右鍵
   If Msg = TRAY_CALLBACK Then
     '如果點擊了左鍵
     If lParam = WM_LBUTTONUP Then
       '而這時窗體的狀態(tài)是最小化時
       If TheForm.WindowState = vbMinimized Then _
        '恢復(fù)到最小化前的窗體狀態(tài)
          TheForm.WindowState = TheForm.LastState
          TheForm.SetFocus
          Exit Function
       End If
     End If
     '如果點擊了右鍵
     If lParam = WM_RBUTTONUP Then
       '則彈出右鍵菜單
       TheForm.PopupMenu TheMenu
       Exit Function
     End If
   End If
   '如果是其他類型的消息則傳遞給原有默認的窗口函數(shù)
   NewWindowProc = CallWindowProc(OldWindowProc, HWnd, Msg, wParam, lParam)
   End Function  

  這樣我們就取得并處理了來自托盤圖標的消息,現(xiàn)在的問題是在鼠標右鍵菜單彈出后,怎么控制程序主窗體的狀態(tài),這時我們需要用到SendMessage函數(shù)來向主窗體發(fā)送最大化、最小化、關(guān)閉、移動等消息,具體的代碼實現(xiàn)如下,其中HWnd是主窗體的句柄,WM_SYSCOMMAND表示發(fā)送的是系統(tǒng)控制類的消息,SC_MOVE、SC_SIZE、SC_RESTORE便是要發(fā)送的消息了:

   '托盤圖標右鍵菜單上的“移動”項被點擊時
   Private Sub mnuTrayMove_Click()
     SendMessage HWnd, WM_SYSCOMMAND, SC_MOVE, 0&
   End Sub
   '托盤圖標右鍵菜單上的“恢復(fù)”項被點擊時
   Private Sub mnuTrayRestore_Click()
     SendMessage HWnd, WM_SYSCOMMAND, SC_RESTORE, 0&
   End Sub
   '托盤圖標右鍵菜單上的“退出”項被點擊時
   Private Sub mnuTraySize_Click()
     SendMessage HWnd, WM_SYSCOMMAND, SC_SIZE, 0&
   End Sub  

  最后要提醒你,在程序退出時一定要把窗口過程的地址恢復(fù)為默認值,同時把托盤圖標移去哦。
   
   為了學(xué)習(xí)方便,以下提供了源代碼:

'---------------------------------------------
' 使用系統(tǒng)托盤程序演示
'---------------------------------------------
'程序說明:
' 這是一個比較完整的使用系統(tǒng)托盤的程序?qū)嵗?br>'了:添加托盤圖標,刪除托盤圖標,動態(tài)改變托盤圖標,
'為托盤圖標添加浮動提示信息,實現(xiàn)托盤圖標的鼠標右鍵
'菜單等內(nèi)容。
'-------名稱-------------------作用------------
' Form1 主窗體
' mnuFile,mnuFileExit 文件菜單,菜單項
' mnuTray,mnuTrayClose... 托盤區(qū)右鍵菜單,菜單項
'---------------------------------------------

Option Explicit

'LastState變量的作用是標示主窗體原有狀態(tài)
Public LastState As Integer

'【VB聲明】
' 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

'【說明】
' 調(diào)用一個窗口的窗口函數(shù),將一條消息發(fā)給那個窗口。除非消息處理完畢,否則該函數(shù)不會返回。SendMessageBynum,
' SendMessageByString是該函數(shù)的“類型安全”聲明形式

'【返回值】
' Long,由具體的消息決定

'【參數(shù)表】
' hwnd ----------- Long,要接收消息的那個窗口的句柄

' wMsg ----------- Long,消息的標識符

' wParam --------- Long,具體取決于消息

' lParam --------- Any,具體取決于消息
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

'表示發(fā)送的是系統(tǒng)命令
Private Const WM_SYSCOMMAND = &H112
Private Const SC_MOVE = &HF010&
Private Const SC_RESTORE = &HF120&
Private Const SC_SIZE = &HF000&

'當(dāng)主窗體加載時
Private Sub Form_Load()

'窗體的WindowState屬性,返回或設(shè)置一個值,該值用來指定在運行時窗體窗口的可視狀態(tài)
'vbNormal 0 (缺省值)正常 。
'VbMinimized 1 最小化(最小化為一個圖標)
'VbMaximized 2 最大化(擴大到最大尺寸)
If WindowState = vbMinimized Then
LastState = vbNormal

Else
LastState = WindowState
End If

'將圖標添加到托盤的函數(shù),參見模塊中的解釋
'注意了這是從主程序到模塊的入口,本例中并沒有直接調(diào)用Shell_NotifyIcon函數(shù)
AddToTray Me, mnuTray

SetTrayTip "托盤圖標演示,點擊右鍵彈出菜單"
End Sub

'在主窗體Form1大小改變時,相應(yīng)改變右鍵菜單mnuTray的菜單項的可用屬性Enabled
Private Sub Form_Resize()
Select Case WindowState

'如果窗體最小化了,把菜單項“最大化”“恢復(fù)”設(shè)為可用,
'而把“最小化”“移動”“大小”三項設(shè)為不可用.
'如果這時在托盤圖標上點擊鼠標右鍵,會發(fā)現(xiàn)不可用項變?yōu)榛疑?br>Case vbMinimized
mnuTrayMaximize.Enabled = True
mnuTrayMinimize.Enabled = False
mnuTrayMove.Enabled = False
mnuTrayRestore.Enabled = True
mnuTraySize.Enabled = False

'窗體最大化時
Case vbMaximized
mnuTrayMaximize.Enabled = False
mnuTrayMinimize.Enabled = True
mnuTrayMove.Enabled = False
mnuTrayRestore.Enabled = True
mnuTraySize.Enabled = False

'一般狀態(tài)下
Case vbNormal
mnuTrayMaximize.Enabled = True
mnuTrayMinimize.Enabled = True
mnuTrayMove.Enabled = True
mnuTrayRestore.Enabled = False
mnuTraySize.Enabled = True
End Select

If WindowState <> vbMinimized Then LastState = WindowState
End Sub

'保證在程序退出時刪除托盤圖標
Private Sub Form_Unload(Cancel As Integer)
RemoveFromTray
End Sub

'“文件”菜單的“退出”項被點擊時
Private Sub mnuFileExit_Click()
Unload Me
End Sub

'托盤圖標右鍵菜單上的“退出”項被點擊時
Private Sub mnuTrayClose_Click()
Unload Me
End Sub

'托盤圖標右鍵菜單上的“最大化”項被點擊時
Private Sub mnuTrayMaximize_Click()
WindowState = vbMaximized
End Sub

'托盤圖標右鍵菜單上的“最小化”項被點擊時
Private Sub mnuTrayMinimize_Click()
WindowState = vbMinimized
End Sub

'托盤圖標右鍵菜單上的“移動”項被點擊時
Private Sub mnuTrayMove_Click()
SendMessage HWnd, WM_SYSCOMMAND, _
SC_MOVE, 0&
End Sub

'托盤圖標右鍵菜單上的“恢復(fù)”項被點擊時
Private Sub mnuTrayRestore_Click()
SendMessage HWnd, WM_SYSCOMMAND, _
SC_RESTORE, 0&
End Sub

'托盤圖標右鍵菜單上的“退出”項被點擊時
Private Sub mnuTraySize_Click()
SendMessage HWnd, WM_SYSCOMMAND, _
SC_SIZE, 0&
End Sub
'-----------------------------------------
'以下為模塊中的代碼:
'-----------------------------------------
Option Explicit

Public OldWindowProc As Long
Public TheForm As Form
Public TheMenu As Menu
'【VB聲明】
'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

'【說明】
' 此函數(shù)發(fā)送消息到一個窗口過程

'【返回值】
' Long,依據(jù)發(fā)送的消息不同而變化

'【參數(shù)表】
' lpPrevWndFunc----- Long,原來的窗口過程地址

' HWnd-------------- Long,窗口句柄

' Msg -------------- Long,發(fā)送的消息

' wParam ----------- Long,消息類型,參考wParam參數(shù)表

' lParam ----------- Long,依據(jù)wParam參數(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

'【VB聲明】
' Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

'【說明】
' 在窗口結(jié)構(gòu)中為指定的窗口設(shè)置信息

'【返回值】
' Long,指定數(shù)據(jù)的前一個值

'【參數(shù)表】
' hwnd ----------- Long,欲為其取得信息的窗口的句柄

' nIndex --------- Long,請參考GetWindowLong函數(shù)的nIndex參數(shù)的說明

' dwNewLong ------ Long,由nIndex指定的窗口信息的新值
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal HWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

'【VB聲明】
'Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

'【說明】

'【參數(shù)表】
'參數(shù)dwMessage ---- 為消息設(shè)置值,它可以是以下的幾個常數(shù)值:0、1、2

'NIM_ADD = 0 加入圖標到系統(tǒng)狀態(tài)欄中
'NIM_MODIFY = 1 修改系統(tǒng)狀態(tài)欄中的圖標
'NIM_DELETE = 2 刪除系統(tǒng)狀態(tài)欄中的圖標

'參數(shù)LpData ---- 用以傳入NOTIFYICONDATA數(shù)據(jù)結(jié)構(gòu)變量,我們也需要在"模塊"中定義其結(jié)構(gòu)如下:

'Type NOTIFYICONDATA
' cbSize As Long 需填入NOTIFYICONDATA數(shù)據(jù)結(jié)構(gòu)的長度
' HWnd As Long 設(shè)置成窗口的句柄
' Uid As Long 為圖標所設(shè)置的ID值
' UFlags As Long 用來設(shè)置以下三個參數(shù)uCallbackMessage、hIcon、szTip是否有效
' UCallbackMessage As Long 消息編號
' HIcon As Long 顯示在狀態(tài)欄上的圖標
' SzTip As String * 64 提示信息
'End Type

'---- 其中參數(shù)uCallbackMessage、hIcon、szTip也應(yīng)在模塊中聲明為以下的常量:
'Public Const NIF_MESSAGE = 1
'Public Const NIF_ICON = 2
'Public Const NIF_TIP = 4

Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

Public Const WM_USER = &H400
Public Const WM_LBUTTONUP = &H202
Public Const WM_MBUTTONUP = &H208
Public Const WM_RBUTTONUP = &H205
Public Const TRAY_CALLBACK = (WM_USER + 1001&)
Public Const GWL_WNDPROC = (-4)
Public Const GWL_USERDATA = (-21)
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIF_MESSAGE = &H1
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2

'記錄 設(shè)置托盤圖標的數(shù)據(jù) 的數(shù)據(jù)類型NOTIFYICONDATA
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

'TheData變量記錄設(shè)置托盤圖標的數(shù)據(jù)
Private TheData As NOTIFYICONDATA
' *********************************************
' 新的窗口過程--主程序中采用SetWindowLong函數(shù)改變了窗口函數(shù)的地址,消息轉(zhuǎn)向由NewWindowProc處理
' *********************************************
Public Function NewWindowProc(ByVal HWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

'如果用戶點擊了托盤中的圖標,則進行判斷是點擊了左鍵還是右鍵
If Msg = TRAY_CALLBACK Then
'如果點擊了左鍵
If lParam = WM_LBUTTONUP Then
'而這時窗體的狀態(tài)是最小化時
If TheForm.WindowState = vbMinimized Then _
'恢復(fù)到最小化前的窗體狀態(tài)
TheForm.WindowState = TheForm.LastState
TheForm.SetFocus
Exit Function
End If
End If
'如果點擊了右鍵
If lParam = WM_RBUTTONUP Then
'則彈出右鍵菜單
TheForm.PopupMenu TheMenu
Exit Function
End If
End If

'如果是其他類型的消息則傳遞給原有默認的窗口函數(shù)
NewWindowProc = CallWindowProc(OldWindowProc, HWnd, Msg, wParam, lParam)
End Function
' *********************************************
' 把主窗體的圖標(Form1.icon屬性可改變)添加到托盤中
' *********************************************
Public Sub AddToTray(frm As Form, mnu As Menu)

'保存當(dāng)前窗體和菜單信息
Set TheForm = frm
Set TheMenu = mnu

'GWL_WNDPROC獲得該窗口的窗口函數(shù)的地址
OldWindowProc = SetWindowLong(frm.HWnd, GWL_WNDPROC, AddressOf NewWindowProc)

'知識點滴:HWnd屬性
'返回窗體或控件的句柄。語法: object.HWnd
'說明:Microsoft Windows 運行環(huán)境,通過給應(yīng)用程序中的每個窗體和控件
'分配一個句柄(或 hWnd)來標識它們。hWnd 屬性用于Windows API調(diào)用。

'將主窗體圖標添加在托盤中
With TheData
.Uid = 0 '忘了嗎?參考一下前面內(nèi)容,Uid圖標的序號,做動畫圖標有用
.HWnd = frm.HWnd
.cbSize = Len(TheData)
.HIcon = frm.Icon.Handle
.UFlags = NIF_ICON '指明要對圖標進行設(shè)置
.UCallbackMessage = TRAY_CALLBACK
.UFlags = .UFlags Or NIF_MESSAGE '指明要設(shè)置圖標或返回信息給主窗體,此句不能省去
.cbSize = Len(TheData) '為什么呢?我們需要在添加圖標的同時,讓其返回信息
End With '給主窗體,Or的意思是同時進行設(shè)置和返回消息
Shell_NotifyIcon NIM_ADD, TheData '根據(jù)前面定義NIM_ADD,設(shè)置為“添加模式”
End Sub
' *********************************************
' 刪除系統(tǒng)托盤中的圖標
' *********************************************
Public Sub RemoveFromTray()
'刪除托盤中的圖標
With TheData
.UFlags = 0
End With
Shell_NotifyIcon NIM_DELETE, TheData '根據(jù)前面定義NIM_DELETE,設(shè)置為“刪除模式”

'恢復(fù)原有的設(shè)置
SetWindowLong TheForm.HWnd, GWL_WNDPROC, OldWindowProc
End Sub
' *********************************************
' 為托盤中的圖標加上浮動提示(也就是鼠標移上去時出現(xiàn)的提示字條)
' *********************************************
Public Sub SetTrayTip(tip As String)
With TheData
.SzTip = tip & vbNullChar
.UFlags = NIF_TIP '指明要對浮動提示進行設(shè)置
End With
Shell_NotifyIcon NIM_MODIFY, TheData '根據(jù)前面定義NIM_MODIFY,設(shè)置為“修改模式”
End Sub
' *********************************************
' 設(shè)置托盤的圖標(在本例中沒有用到,如果要動態(tài)改變托盤內(nèi)顯示的圖標,它非常有用)
' 例如:1、顯示動畫圖標(方法你一定猜到了,對!使用Timer控件,不斷調(diào)用此過程,注意把動畫放在pic數(shù)組中)
' 2、程序處于不同狀態(tài)時,顯示不同的圖標,方法是類似的
' 有興趣的話試一試吧。
' *********************************************
Public Sub SetTrayIcon(pic As Picture)
'判斷一下pic中存放的是不是圖標
If pic.Type <> vbPicTypeIcon Then Exit Sub

'更換圖標為pic中存放的圖標
With TheData
.HIcon = pic.Handle
.UFlags = NIF_ICON
End With
Shell_NotifyIcon NIM_MODIFY, TheData
End Sub 

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 欧美在线一区视频| 日本中文字幕二区| 精品一区二区三区毛片| 三区视频在线观看| 黄色永久免费网站| 天天操天天爽天天射| 91视频 -- 69xx| 国产黄色一级网站| 精品国产成人av在线免| 男女曰b免费视频| 日日噜噜噜噜久久久精品毛片| 日本在线视频www| 男女视频在线看| 超碰在线免费观看97| www.日本三级| 男人日女人bb视频| 欧美日韩在线免费播放| 在线看免费毛片| 女人床在线观看| 亚洲 自拍 另类小说综合图区| 鲁一鲁一鲁一鲁一澡| 免费黄色特级片| 日本黄色a视频| 欧美一级视频免费看| 国产精品亚洲二区在线观看| 欧美成人乱码一二三四区免费| 国产精品视频分类| 五月天激情图片| 成年人视频在线免费| 黄色片免费网址| 国产精品网站免费| 亚洲精品久久久中文字幕| 天堂网成人在线| 国产91在线免费| 亚洲18在线看污www麻豆| av 日韩 人妻 黑人 综合 无码| 欧美一级在线看| 99精品视频网站| 日韩手机在线观看视频| 不卡中文字幕在线观看| 日韩视频免费播放| 国产精品探花在线播放| 中国丰满人妻videoshd| 一二三在线视频| 国产精品区在线| 黄色片视频在线免费观看| 99精品视频国产| 久久久精品麻豆| www.射射射| 亚洲天堂第一区| 自拍偷拍21p| 黄色三级视频在线| 又粗又黑又大的吊av| 性做爰过程免费播放| 亚洲高清免费在线观看| 欧美亚洲精品一区二区| 成人在线免费高清视频| 国产精品999.| а 天堂 在线| 五月天婷婷亚洲| 成人免费视频久久| 日日摸天天爽天天爽视频| 日本在线xxx| 91精品国产91久久久久麻豆 主演| 亚洲精品mv在线观看| 亚洲精品性视频| www.久久久久久久久久久| 午夜久久福利视频| 精品综合久久久久| 亚洲精品手机在线观看| 亚洲成人av免费看| 992kp快乐看片永久免费网址| 国产精品第12页| 99视频免费播放| 国产野外作爱视频播放| 精品亚洲一区二区三区四区| 天天干天天草天天| 日本网站在线看| 欧美极品少妇无套实战| 蜜桃网站在线观看| 蜜桃传媒一区二区三区| 日本在线视频www| 国产精品自拍视频在线| 欧美h视频在线观看| 国产a级黄色大片| 亚洲中文字幕无码中文字| 日本激情视频在线| 国产精品igao网网址不卡| 菠萝蜜视频在线观看入口| 免费毛片小视频| 中文字幕久久av| 美女扒开大腿让男人桶| 春日野结衣av| 国产成人强伦免费视频网站| 国产精品国三级国产av| 日本一本二本在线观看| 黄频视频在线观看| 自拍日韩亚洲一区在线| 在线观看免费不卡av| 国产欧美日韩网站| 午夜一级免费视频| 亚洲国产精品无码观看久久| 亚洲色图 在线视频| 国产天堂视频在线观看| 亚洲精品自拍网| 亚洲 自拍 另类小说综合图区 | 青娱乐精品在线| 可以在线看的av网站| 亚洲国产午夜精品| 久热免费在线观看| 成年人视频网站免费| 亚洲天堂av线| 69堂免费视频| www国产无套内射com| 天天干天天操天天做| 国产乱子夫妻xx黑人xyx真爽| 色黄视频免费看| 妺妺窝人体色www在线观看| 大胆欧美熟妇xx| 自拍偷拍视频在线| 黄色小视频免费网站| 国产又大又硬又粗| 欧美极品欧美精品欧美| 久久国产精品免费观看| 中文字幕日韩久久| 天堂在线中文在线| av中文字幕网址| 99视频在线视频| 日本va中文字幕| 九色91popny| 激情五月婷婷久久| 午夜免费一区二区| 成人亚洲视频在线观看| 久章草在线视频| av无码精品一区二区三区| 成人在线免费观看av| 国产高清精品在线观看| 18岁网站在线观看| aaa毛片在线观看| 91精品无人成人www| 在线观看的毛片| 特黄视频免费观看| 四虎影院一区二区| 亚洲av综合色区| 欧美精品久久久久久久久久久| 人人干视频在线| 国产性生交xxxxx免费| 爱情岛论坛成人| 在线免费看污网站| 黄色一级大片免费| 国产黄页在线观看| 亚洲一级免费观看| 免费观看中文字幕| 乱妇乱女熟妇熟女网站| 性生交免费视频| 精品91一区二区三区| 91黄色在线看| 国产小视频精品| 91亚洲精品国产| 91看片在线免费观看| 亚洲热在线视频| 日韩精品视频久久| 免费成年人高清视频| 搞av.com| 国产永久免费网站| 99国产精品白浆在线观看免费| 黄色一级大片在线观看| 黄瓜视频免费观看在线观看www | www.日本一区| 欧美这里只有精品| 日韩福利视频在线| 999久久欧美人妻一区二区| 999香蕉视频| 草b视频在线观看| 亚洲精品20p| 欧美少妇性生活视频| 日韩av在线中文| 成人在线观看a| 亚洲精品蜜桃久久久久久| 免费看涩涩视频| 久久久噜噜噜www成人网| 免费观看国产视频在线| xxxx一级片| 欧美牲交a欧美牲交aⅴ免费真| 国产美女视频免费| 亚洲精品视频三区| 999精品视频在线| 黄色片久久久久| 一女被多男玩喷潮视频| 好吊色视频988gao在线观看| 在线播放av中文字幕| 密臀av一区二区三区| 日日碰狠狠添天天爽超碰97| 日本天堂免费a| 日韩video| 99久热在线精品视频| 国产一级不卡视频| 日韩在线视频在线| 日韩激情视频一区二区| 路边理发店露脸熟妇泻火|