调用: sub main() Call HookShutDown(Me.hwnd) sub 标准模块:Public Const MAX_TOOLTIP As Integer = 64 Public Const NIF_ICON = &H2 Public Const NIF_MESSAGE = &H1 Public Const NIF_TIP = &H4 Public Const NIM_ADD = &H0 Public Const NIM_DELETE = &H2 Public Const WM_MOUSEMOVE = &H200 Public Const WM_LBUTTONDOWN = &H201 Public Const WM_LBUTTONUP = &H202 Public Const WM_LBUTTONDBLCLK = &H203 Public Const WM_RBUTTONDOWN = &H204 Public Const WM_RBUTTONUP = &H205 Public Const WM_RBUTTONDBLCLK = &H206 Public Const SW_RESTORE = 9 Public Const SW_HIDE = 0 Public nfIconData As NOTIFYICONDATAPublic Type NOTIFYICONDATA cbSize As Long hwnd As Long uID As Long uFlags As Long uCallbackMessage As Long hIcon As Long szTip As String * MAX_TOOLTIP End TypePublic Declare Function ShowWindow _ Lib "user32" (ByVal hwnd As Long, _ ByVal nCmdShow As Long) As LongPublic Declare Function Shell_NotifyIcon _ Lib "shell32.dll" _ Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, _ lpData As NOTIFYICONDATA) As LongPrivate Const GWL_WNDPROC = (-4) Private Const WM_ENDSESSION = &H16 Private Const WM_QUERYENDSESSION = &H11 Private WndProc As LongPublic Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate 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 LongPrivate Declare Function SetWindowLong _ Lib "user32" _ Alias "SetWindowLongA" (ByVal hwnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As LongConst HWND_TOPMOST = -1 Const HWND_NOTOPMOST = -2 Const SWP_NOSIZE = &H1 Const SWP_NOMOVE = &H2Public Sub HookShutDown(ByVal hwnd As Long) If WndProc = 0 Then WndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc) End IfEnd SubPublic Sub UnHookShutDown(ByVal hwnd As Long) If WndProc <> 0 Then Call SetWindowLong(hwnd, GWL_WNDPROC, WndProc) WndProc = 0 End IfEnd SubPrivate Function WindowProc(ByVal hw As Long, _ ByVal uMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long If uMsg = WM_QUERYENDSESSION Then WindowProc = False '为0 Exit Function ElseIf uMsg = WM_ENDSESSION Then WindowProc = False '为0 Exit Function End If WindowProc = CallWindowProc(WndProc, hw, uMsg, wParam, lParam) End Function
sub main()
Call HookShutDown(Me.hwnd)
sub
标准模块:Public Const MAX_TOOLTIP As Integer = 64
Public Const NIF_ICON = &H2
Public Const NIF_MESSAGE = &H1
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIM_DELETE = &H2
Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const WM_RBUTTONDBLCLK = &H206
Public Const SW_RESTORE = 9
Public Const SW_HIDE = 0
Public nfIconData As NOTIFYICONDATAPublic Type NOTIFYICONDATA cbSize As Long
hwnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * MAX_TOOLTIP
End TypePublic Declare Function ShowWindow _
Lib "user32" (ByVal hwnd As Long, _
ByVal nCmdShow As Long) As LongPublic Declare Function Shell_NotifyIcon _
Lib "shell32.dll" _
Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, _
lpData As NOTIFYICONDATA) As LongPrivate Const GWL_WNDPROC = (-4)
Private Const WM_ENDSESSION = &H16
Private Const WM_QUERYENDSESSION = &H11
Private WndProc As LongPublic Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate 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 LongPrivate Declare Function SetWindowLong _
Lib "user32" _
Alias "SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As LongConst HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2Public Sub HookShutDown(ByVal hwnd As Long) If WndProc = 0 Then
WndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End IfEnd SubPublic Sub UnHookShutDown(ByVal hwnd As Long) If WndProc <> 0 Then
Call SetWindowLong(hwnd, GWL_WNDPROC, WndProc)
WndProc = 0
End IfEnd SubPrivate Function WindowProc(ByVal hw As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long If uMsg = WM_QUERYENDSESSION Then
WindowProc = False '为0
Exit Function ElseIf uMsg = WM_ENDSESSION Then
WindowProc = False '为0
Exit Function End If WindowProc = CallWindowProc(WndProc, hw, uMsg, wParam, lParam)
End Function