Declare
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
' System Tray Public Type NOTIFYICONDATA cbsize As Long hwnd As Long uID As Long uFlag As Long uCallBackMessage As Long hIcon As Long szTip As String * 64 End Type Public Const NIM_ADD As Long = &H0 Public Const NIM_MODIFY As Long = &H1 Public Const NIM_DELETE As Long = &H2 Public Const NIF_ICON As Long = &H2 'adding an ICON Public Const NIF_TIP As Long = &H4 'adding a TIP Public Const NIF_MESSAGE As Long = &H1 'want return messages Public NID As NOTIFYICONDATA Public Declare Function Shell_NotifyIcon Lib "shell32.dll" _ Alias "Shell_NotifyIconA" _ (ByVal dwMessage As Long, _ lpData As NOTIFYICONDATA) As Long
Procedures
Public Sub addSysIcon(hwnd As Long, ID As Long, IconImage As Long, Tip As String, msgID As Long, NID As NOTIFYICONDATA) NID.cbsize = Len(NID) NID.hwnd = hwnd NID.uID = ID ' User-defined value 1001 NID.uFlag = NIF_MESSAGE + NIF_ICON + NIF_TIP NID.hIcon = IconImage NID.szTip = Tip + Chr(0) NID.uCallBackMessage = msgID Shell_NotifyIcon NIM_ADD, NID End Sub
Public Sub changeSysIcon(hwnd As Long, ID As Long, IconImage As Long, Tip As String, msgID As Long, NID As NOTIFYICONDATA) NID.cbsize = Len(NID) NID.hwnd = hwnd NID.uID = ID NID.uFlag = NIF_MESSAGE + NIF_ICON + NIF_TIP NID.hIcon = IconImage NID.szTip = Tip + Chr(0) NID.uCallBackMessage = msgID Shell_NotifyIcon NIM_MODIFY, NID End Sub
Public Sub UnSubClass() 'restore the default message handling 'before exiting On Error Resume Next If defWindowProc Then SetWindowLong fMain.hwnd, GWL_WNDPROC, defWindowProc defWindowProc = 0 End If End Sub Public Sub SubClass(hwnd As Long) 'assign our own window message 'procedure (WindowProc) On Error Resume Next defWindowProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc) End Sub
Public Function WindowProc(ByVal hwnd As Long, _ ByVal uMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Dim Tip As String Dim ValidPass As String ' Respond to mouse event in systray On Error GoTo WndProcErr 'On Error Resume Next 'Debug.Print uMsg 'Debug.Print lParam Select Case hwnd 'form-specific handler Case fMain.hwnd 'Debug.Print "hwnd" Select Case uMsg 'check uMsg for the application-defined 'identifier (NID.uID) assigned to the 'systray icon in NOTIFYICONDATA (NID). 'WM_MYHOOK was defined as the message sent 'as the .uCallbackMessage member of 'NOTIFYICONDATA the systray icon Case WM_MYHOOK 'Debug.Print "uMsg - myhook" Select Case fMain.Winsock(sIdx).State Case sckClosed Tip = "x Chat - [Closed]" Case sckListening Tip = "x Chat - [Listening]" Case sckConnected Tip = "x Chat - [Connected] " & fMain.Winsock(sIdx).RemoteHostIP Case sckError Tip = "x Chat - [Socket Error]" Case sckConnecting Tip = "x Chat - [Connecting]" End Select changeSysIcon fMain.hwnd, 1001, fMain.Icon, Tip, WM_MYHOOK, NID 'NID.szTip = tip + Chr(0) 'lParam is the value of the message 'that generated the tray notification. Select Case lParam Case WM_RBUTTONUP If ActiveProtect And PassSet2 Then fMain.mnuSysAutoConnect.Enabled = False fMain.mnuSysProprerty.Enabled = False End If If frmUnlock.Visible = False And frmPassLock.Visible = False Then _ fMain.PopupMenu fMain.mnuTray Case WM_LBUTTONDBLCLK If frmUnlock.Visible = False Then fMain.ShowMain End Select 'handle any other form messages by 'passing to the default message proc Case Else WindowProc = CallWindowProc(defWindowProc, _ hwnd, _ uMsg, _ wParam, _ lParam) Exit Function End Select 'this takes care of messages when the 'handle specified is not that of the form Case Else WindowProc = CallWindowProc(defWindowProc, _ hwnd, _ uMsg, _ wParam, _ lParam) End Select WndProcErr: If Err.Number <> 0 Then 'removeSysIcon fMain.hwnd, 1001 End End If End Function