Systray et plantage d'explorer.exe

Description

Voici un bout de code qui n'explique rien sur le fonctionnement des icônes dans le systray. Il y a déjà assez de sources là-dessus sur VBFrance!!!

Alors que fait ce programme me direz-vous?

Et ben, il permet de recréer l'icône de notre appli lorsqu'elle a disparu après un plantage de explorer.exe.
La méthode est simple, on crée un Hook sur notre fenêtre et on enregistre le message "TaskbarCreated". C'est à dire que lorsque Windows recréra la barre de tâches, notre appli sera avertie et donc on pourra recréer notre icône. Vous suivez???

Voilà donc rien de bien compliqué et le code est facilement intégrable dans vos applis utilisant le systray.

Source / Exemple :


'Dans le Form

Option Explicit

Private Sub Form_Load()

   InstalleHookSystray Me.HWnd
   
   IconeT.cbSize = Len(IconeT)
   IconeT.HWnd = Me.HWnd
   IconeT.uID = 1&
   IconeT.uFlags = ICONE Or TIP Or MESSAGE
   IconeT.uCallbackMessage = MOUSEMOVE
   IconeT.hIcon = Form1.Icon
   Shell_NotifyIcon AJOUT, IconeT

End Sub

Private Sub Form_Unload(Cancel As Integer)

   DesinstalleHookSystray Me.HWnd
   Shell_NotifyIcon SUPPRIME, IconeT

End Sub

'Et dans le module

Option Explicit

'APIs de Hook
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal HWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Private 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

'API systray
Public Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As IconeTray) As Boolean

Public Type IconeTray
    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 Const AJOUT = &H0
Public Const SUPPRIME = &H2
Public Const MOUSEMOVE = &H200
Public Const MESSAGE = &H1
Public Const ICONE = &H2
Public Const TIP = &H4

Private Const GWL_WNDPROC = (-4)
Dim m_TaskbarCreated As Long
Dim Save_WndProc_Adresse As Long

Public IconeT As IconeTray

Public Sub InstalleHookSystray(lHwnd As Long)
    
   'On installe un Hook sur le message TaskbarCreated
   m_TaskbarCreated = RegisterWindowMessage("TaskbarCreated")
   Save_WndProc_Adresse = SetWindowLong(lHwnd, GWL_WNDPROC, AddressOf Capture_Message_Windows)
   
End Sub

Public Sub DesinstalleHookSystray(lHwnd As Long)
   
   SetWindowLong lHwnd, GWL_WNDPROC, Save_WndProc_Adresse
   
End Sub

Private Function Capture_Message_Windows(ByVal HWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

   'Si le message correspond alors on recrée l'icône
   If uMsg = m_TaskbarCreated Then
      Shell_NotifyIcon AJOUT, IconeT
   End If

   Capture_Message_Windows = CallWindowProc(Save_WndProc_Adresse, HWnd, uMsg, wParam, lParam)
   
End Function

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.