Explorer 崩溃重启后的任务栏图标重建

 

在窗体中:
'**************************************************************************
'**模 块 名:工程1 - Form1
'**说 明:永远的魔灵 by icecept(郭卫)
'**创 建 人:icecept(魔灵)
'**日 期:2009-06-17 01:09:52
'**修 改 人:icecept(魔灵)
'**版 本:V1.0.0
'**E-mail   : icecept@163.com QQ:543375508
'**网 址: http://hi.baidu.com/icecept    http://hi.csdn.net/icecept
'*************************************************************************
Option Explicit
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
pWndProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)
'explorer重启之后广播的一个 windows message 消息
MsgTaskbarRestart = RegisterWindowMessage("TaskbarCreated")
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
On Error Resume Next
Shell_NotifyIcon NIM_DELETE, nfIconData
pWndProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)
End Sub

在模块中:
'**************************************************************************
'**模 块 名:工程1 - Form1
'**说 明:永远的魔灵 by icecept(郭卫)
'**创 建 人:icecept(魔灵)
'**日 期:2009-06-17 01:09:52
'**修 改 人:icecept(魔灵)
'**版 本:V1.0.0
'**E-mail   : icecept@163.com QQ:543375508
'**网 址: http://hi.baidu.com/icecept    http://hi.csdn.net/icecept
'--------------------------------------------------------------------------
'实现托盘图标
Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" _
                     (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Public nfIconData As NOTIFYICONDATA
Public Const MAX_TOOLTIP As Integer = 64
Public Const NIF_ICON = &H2                          '删除图标
Public Const NIF_MESSAGE = &H1                       'NOTIFYICONDATA结构中uFlags的控制信息
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 Type NOTIFYICONDATA
cbSize           As Long                '该数据结构的大小
hwnd          As Long                '处理任务栏中图标的窗口句柄
uID              As Long                '定义的任务栏中图标的标识
uFlags           As Long                '任务栏图标功能控制,可以是以下值的组合(一般全包括)
'NIF_MESSAGE 表示发送控制消息;
'NIF_ICON表示显示控制栏中的图标;
'NIF_TIP表示任务栏中的图标有动态提示。
uCallbackMessage As Long                '任务栏图标通过它与用户程序交换消息,处理该消息的窗口由hWnd决定
hIcon          As Long                '任务栏中的图标的控制句柄
szTip          As String * MAX_TOOLTIP '图标的提示信息
End Type
'实现托盘菜单自动消失功能
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Public 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
Public Const GWL_WNDPROC = (-4)
Public Const WM_USER = &H400
Public Const WM_TRAYICON = WM_USER + 123 '托盘消息
Public pWndProc As Long
'---------------------------------------------------------------
'RegisterWindowMessage获取分配给一个字串标识符的消息编号
'返回值Long,&C000 到 &FFFF之间的一个消息编号。零意味着出错
'参数 类型及说明
'lpString String,注册消息的名字
'注解如果没有一个子类处理程序的帮助,这个函数就没有什么用
Public Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" _
                     (ByVal lpString As String) As Long
Public MsgTaskbarRestart As Long
Public Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
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
'Explorer.exe 崩溃之后重建任务栏图标
If Msg <> MsgTaskbarRestart Then
       WndProc = CallWindowProc(pWndProc, hwnd, Msg, wParam, lParam)
Else
       '原理:Explorer.exe 重新载入后会重建系统任务栏。当系统任务栏建立的时候会向系统内所有
       '注册接收TaskbarCreated 消息的顶级窗口发送一条消息,我们只需要捕捉这个消息,并重建系统托盘的图标即可。
       Shell_NotifyIcon NIM_ADD, nfIconData '关键的一步,使图标重建
       WndProc = True
End If
DoEvents
End Function

附件: Explorer 崩溃重启后的任务栏图标重建.rar
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值