用VB實現窗口圖標最小化到通知欄

發表于:2007-05-25來源:作者:點擊數: 標簽:最小化只要圖標窗口通知
只要我們能截獲最小化這個事件發送給窗口的消息,然后換成我們自定義的過程,問題就解決了。大家仔細想一想,當按下最小化按紐時會引發什么事件?最小化時窗口大小會發生變化會引發Form1.Resize事件,我們只要在Form1.Resize事件里用Form1.Visible = False使
  只要我們能截獲最小化這個事件發送給窗口的消息,然后換成我們自定義的過程,問題就解決了。大家仔細想一想,當按下最小化按紐時會引發什么事件?最小化時窗口大小會發生變化會引發Form1.Resize事件,我們只要在Form1.Resize事件里用Form1.Visible = False使窗口消失,然后將窗口圖標顯示到通知欄即可達到我們想要的效果。

  怎樣判斷發生Resize事件時窗口是最小化狀態呢?VB里沒有現成的做法,我們可以用非富的API函數。API函數庫里有一個函數IsIconic(ByVal hwnd As Long),它就是專門判斷窗口是否已最小化的。這樣當Form產生Resize事件時,用IsIconic函數判斷一下窗口是否為最小化狀態,就可知道是否用戶按了最小化按鈕。

  最關鍵的一步就是將圖標顯示在通知欄里,VB里沒有現成的做法,我們還得用API函數。API函數庫里有一個函數Shell_NotifyIcon(ByVal dwMessage As Long, lpData As NOTIFYICONDATA),是專門操作(包括添加、修改、刪除)通知欄里圖標的。

  點一下通知欄圖標,會出現一些諸如"退出"、"顯示窗口"的彈出菜單,怎樣實現彈出菜單呢?這個很容易實現,因為點擊圖標會觸發圖標所在窗口的MouseDown事件,我們把彈出菜單觸發過程寫入Form1_MouseDown事件即可。具體例程如下:

  第一步、為了增強程序的可移植性,我們新建一個模塊,取名為:NoticeIcon,在此模塊中定義一些常量、自定義類型、所需的API函數說明及操作通知欄圖標的三個自定義函數(添加、修改、刪除),模塊NoticeIcon具體代碼如下所示:

Public Const DefaultIconIndex = 1 圖標缺省索引
Public Const WM_LBUTTONDOWN = &H201 按鼠標左鍵
Public Const WM_RBUTTONDOWN = &H204 按鼠標右鍵

Public Const NIM_ADD = 0 添加圖標
Public Const NIM_MODIFY = 1 修改圖標
Public Const NIM_DELETE = 2 刪除圖標

Public Const NIF_MESSAGE = 1 message 有效
Public Const NIF_ICON = 2 圖標操作(添加、修改、刪除)有效
Public Const NIF_TIP = 4 ToolTip(提示)有效

API函數聲明
圖標操作
Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
判斷窗口是否最小化
Declare Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long

設置窗口位置和狀態(position)的功能
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 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

函數定義
添加圖標至通知欄
Public Function Icon_Add(iHwnd As Long, sTips As String, hIcon As Long, IconID As Long) As Long
 參數說明:iHwnd:窗口句柄,sTips:當鼠標移到通知欄圖標上時顯示的提示內容
 hIcon:圖標句柄,IconID:圖標Id號
 Dim IconVa As NOTIFYICONDATA
 With IconVa
  .hwnd = iHwnd
  .szTip = sTips + Chr$(0)
  .hIcon = hIcon
  .uID = IconID
  .uCallbackMessage = WM_LBUTTONDOWN
  .cbSize = Len(IconVa)
  .uFlags = NIF_MESSAGE Or NIF_ICON Or NIF_TIP
  Icon_Add = Shell_NotifyIcon(NIM_ADD, IconVa)
 End With
End Function
刪除通知欄圖標(參數說明同Icon_Add)
Function Icon_Del(iHwnd As Long, lIndex As Long) As Long
 Dim IconVa As NOTIFYICONDATA
 Dim L As Long
 With IconVa
  .hwnd = iHwnd
  .uID = lIndex
  .cbSize = Len(IconVa)
 End With
 Icon_Del = Shell_NotifyIcon(NIM_DELETE, IconVa)
End Function
修改通知欄圖標(參數說明同Icon_Add)
Public Function Icon_Modify(iHwnd As Long, sTips As String, hIcon As Long, IconID As Long) As Long
 Dim IconVa As NOTIFYICONDATA
 With IconVa
  .hwnd = iHwnd
  .szTip = sTips + Chr$(0)
  .hIcon = hIcon
  .uID = IconID
  .uCallbackMessage = WM_LBUTTONDOWN
  .cbSize = Len(IconVa)
  .uFlags = NIF_MESSAGE Or NIF_ICON Or NIF_TIP
  Icon_Modify = Shell_NotifyIcon(NIM_MODIFY, IconVa)
 End With
End Function


原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97