程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB6 >> 用VB編寫托盤程序

用VB編寫托盤程序

編輯:VB6

在WINDOWS裡,右下角有許多應用程序的圖標。而程序本身的窗口是隱藏的,若你需要調用應用程序的窗口,則雙擊該圖標即可。這種程序稱為托盤程序。這是WINDOWS98操作系統的一大特色。使用戶能夠更加快捷的顯示和隱藏應用程序,可以使任務欄不致於太亂。托盤程序在Visual Basic裡是怎麼實現的呢?

編寫托盤程序主要解決兩個問題:

(1)創建、修改、刪除托盤;

(2)如何對托 盤接收到的消息進行處理。

這就要用到幾個Windows API函數。

首先,Shell_NotifyIcon是用於托盤的Shell API。該API用到一個NOTIFYICONDATA結構.

  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

其次,應該考慮怎樣在VB中接收、處理托盤的消息(雙擊、單擊、左鍵、右 鍵)。C++、Delphi等語言對消息循環的處理較簡單,但在VB中處理消息循環時必須應用Win32的SetWindowLong、CallWindowProc這兩個API函數。SetWindowLong函數利用 GWL_WNDPROC 索引來創建窗口類的子類(窗口類是用來創建窗口的),它使用AddressOf關鍵字和回調函數(WindowProc)來截取消息並根據消息來執行相應的功能,如窗口的最大化、最小化、隱藏、退出等。CallWindowProc函數調用原窗口類缺省的指針,程序最後退出時可通過SetWindowLong來關閉子類,重新使原來的Windows過程成為回調函數。

本程序項目包括一個模塊和一個窗體

1、模塊源代碼為:

Option Explicit 強制定義每個使用的變量

  Type NOTIFYICONDATA 定義結構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

以下為 Shell_NotifyIcon將用到的常量

  Public Const NIF_ICON = &H r>   Public Const NIF_MESSAGE = &H1
   Public Const NIF_TIP = &H4
   Public Const NIM_ADD = &H0
   Public Const NIM_DELETE = &H2
   Public Const NIM_MODIFY = &H1

Shell_NotifyIcon的函數聲明

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

處理消息將用到的結構、常量、API聲明

  Type POINTAPI
     x As Long
     y As Long
   End Type
   Type Msg
     hwnd As Long
     message As Long
     wParam As Long
     lParam As Long
     time As Long
     pt As POINTAPI
   End Type
   Public Const WM_USER = &H400
   Public Const WM_RBUTTONDOWN = &H204
   Public Const WM_LBUTTONDBLCLK = &H203
   Public Const GWL_WNDPROC = -4
   Public trayflag As Boolean 定義托盤圖標是否在桌面上
   Global lpPrevWndProc As Long
   Global gHW 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 SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

以下過程為消息循環處理

  Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   If hw = Form1.hwnd And uMsg = WM_USER+100 Then檢測到鼠標點動托盤圖標
     Select Case lParam
       Case WM_RBUTTONDOWN 鼠標右鍵按下
         Form1.PopupMenu Form1.mainmenu 彈出菜單
       Case WM_LBUTTONDBLCLK 鼠標左鍵雙擊
         Form1.Show 顯示窗口
       Case Else
     End Select
   Else 調用缺省窗口指針
     WindowProc = CallWindowProc(lpPrevWndProc, hw,uMsg, wParam, lParam)
   End If
   End Function
   Public Sub hook()

將程序勾入消息環中

利用AddressOf取得消息處理函數WindowProc的指針,並將其傳給SetWindowLong

lpPrevWndProc用來存儲原窗口的指針

  lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
   End Sub
   Public Sub Unhook()

將程序從消息環退出。用原窗口的指針替換WindowProc函數的指針,即關閉子類、退 出消息循環

  Dim temp As Long
   temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
   End Sub

2、在窗口form1加入一個主菜單mainmenu,設置為不可見。在加入一些子菜單如" 顯示窗口"(名稱為:show),"隱藏窗口"(名稱為:hide),退出程序"(名稱為:exit)。 在加入四個按鈕Command1,Command2,Command3,Command。caption屬性分別為:"刪除托 盤圖標","創建托盤圖標","修改托盤圖標","退出程序".

代碼窗口的內容為:

Dim MyNot As NOTIFYICONDATA 定義一個托盤結構

Private Sub Command1_Click()

按下刪除托盤圖標按鈕

  With MyNot
     .hIcon = Form1.Icon 托盤圖標指針指向窗口的圖標
     .hwnd = Form1.hwnd 窗體指針
     .szTip = "" 彈出提示字符串,刪除時應為空
     .uCallbackMessage = WM_USER + 100 對應程序定義的消息
     .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE 圖標標志
     .uID = 1 圖標識別符
     .cbSize = Len(MyNot) 計算結構實例MyNot的長度
   End With
   hh = Shell_NotifyIcon(NIM_DELETE, MyNot) 刪除該托盤圖標
   trayflag = False 托盤圖標刪除後trayflag為假
   End Sub
   Private Sub Command2_Click() 按下創建托盤圖標按鈕
   Dim hh As Long
   With MyNot
     .hIcon = Form1.Icon
     .hwnd = Form1.hwnd
     .szTip = "托盤圖標" & Chr(&H0)
     .uCallbackMessage = WM_USER + 100
     .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
     .uID = 1
     .cbSize = Len(MyNot)
   End With
   hh = Shell_NotifyIcon(NIM_ADD, MyNot) 添加一個托盤圖標
   trayflag = True 托盤圖標添加後trayflag為真
   End Sub
   Private Sub Command3_Click() 按下修改托盤圖標按鈕
   Dim hh As Long
   Set P = LoadPicture("cd.ico") 導入一個新圖標
   With MyNot
     .hIcon = P 將托盤圖標改為新圖標
     .hwnd = Form1.hwnd
     .szTip = "光盤圖標" & Chr(&H0) 更改提示信息
     .uCallbackMessage = WM_USER + 100
     .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
     .uID = 1
     .cbSize = Len(MyNot)
   End With
   hh = Shell_NotifyIcon(NIM_MODIFY, MyNot) 修改托盤圖標的某些特征
   End Sub
   Private Sub Command4_Click() 退出窗口按鈕被按下
   If trayflag = True Then Command1_Click 如果托盤圖標仍在,模擬按下"刪 除托盤圖標"按鈕
   Unhook 退出消息循環
   Unload Me 卸載窗體
   End Sub
   Private Sub exit_Click()
   If trayflag = True Then Command1_Click 如果托盤圖標仍在,模擬按下"刪除托 盤圖標"按鈕
   Unhook 退出消息循環
   Unload Me 卸載窗體
   End Sub
   Private Sub Form_Load()
   gHW = Me.hwnd 取得本窗體指針
   hook 調用鉤子函數,將自制消息處理函數鉤入Windows的消息循環
   End Sub
   Private Sub hide_Click()
   Form1.hide 隱藏窗口
   End Sub
   Private Sub show_Click()
   Form1.show 顯示窗口
   End Sub

在VB中編譯這個程序,點擊創建托盤圖標。則在任務欄的右下角出現在一圖標。 將鼠標放在此圖標上,則顯示一條信息。點擊右鍵,彈出菜單,可以選擇相應的功能執 行的。當窗口隱藏時雙擊托盤圖標可顯示窗口。注意:在VB中使用函數指針將使程序變 得脆弱,在運用與其相關的函數及關鍵字時要多加小心。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved