我想这是最好的方法,让程序一秒钟检查一次。效果是很好的。
那么请看下一段程序,我觉得不好
复制内容到剪贴板
代码:
Option Explicit
'RegisterWindowMessage获取分配给一个字串标识符的消息编号
'返回值Long,&C000 到 &FFFF之间的一个消息编号。零意味着出错
'参数 类型及说明
'lpString String,注册消息的名字
'注解如果没有一个子类处理程序的帮助,这个函数就没有什么用
Private Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" _
(ByVal lpString As String) As Long
Private Sub Form_Load()
nfIconData.hwnd = Me.hwnd
nfIconData.uID = Me.Icon
nfIconData.uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP
nfIconData.uCallbackMessage = WM_TRAYICON
nfIconData.hIcon = Me.Icon.Handle
nfIconData.szTip = App.Title + "(版本 " & App.Major & "." & App.Minor & "." & App.Revision & ")" & vbNullChar
nfIconData.cbSize = Len(nfIconData)
Shell_NotifyIcon NIM_ADD, nfIconData
MsgTaskbarRestart = RegisterWindowMessage("TaskbarCreated") '得到explorer windows消息
pWndProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)
End Sub
'在标准模块中建立
Public MsgTaskbarRestart As Long
Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg <> MsgTaskbarRestart Then '当explorer重启后的消息比较
If Msg = WM_TRAYICON Then
Select Case lParam
Case WM_LBUTTONDOWN
FrmAbout.Show 0
Case WM_RBUTTONDOWN
SetForegroundWindow hwnd '关键的一步,使菜单重画
Case WM_RBUTTONUP
Form1.PopupMenu Form1.Index
End Select
End If
WndProc = CallWindowProc(OldWndProc, hwnd, uMsg, wParam, lParam)
Else
Shell_NotifyIcon NIM_ADD, nfIconData '关键的一步,使托盘图标重画
WndProc = -1
End If
End Function