begin process at 2012 02 13 07:35:39
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > SYSTRAY ET PLANTAGE D'EXPLORER.EXE

SYSTRAY ET PLANTAGE D'EXPLORER.EXE


 Information sur la source

Note :
10 / 10 - par 3 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Classé sous :systray, icone, plantage, explorer, taskbarcreated Niveau :Initié Date de création :22/03/2006 Vu / téléchargé :11 415 / 496

Auteur : clementio

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (21)
Ajouter un commentaire et/ou une note


 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

  • '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
'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



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture DICO ACCORDS GUITARE
Source avec Zip Source avec une capture CLM'S GUITARE : DICO ACCORDS + ACCORDAGE
Source avec Zip Source avec une capture CLM'S EMERGENCY : REFROIDISSEUR DE CPU
Source avec Zip Source avec une capture CLM'S MESSENGER : AJOUT DE FONCTIONS À WINDOWS LIVE MESSENGE...
Source avec Zip Source avec une capture CLMOOGLE : MOTEUR DE RECHERCHE INTUITIF

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) .NET DEPENDENCY VIEWER : ARBRE DES DÉPENDANCES D'UN ASSEMBLY... par ShareVB
Source avec Zip Source .NET (Dotnet) UTILITAIRE SKYDRIVE par MasterShadows
Source avec Zip ROTATION RAPIDE D'IMAGE par trex70
Source avec Zip Source avec une capture ENUMERATION DES PORTS TCP ET IDENTIFCATION DU PROCESS (PID) ... par Renfield
Source avec Zip Source avec une capture MOUSE SPEED AND WEIGHT : RETOUR DE FORCE VIRTUEL ! par ScSami

 Sources en rapport avec celle ci

Source avec Zip UN CONTROL SYSTRAY (ET OUI ENCORE UN) MAIS ASSEZ COMPLET par bouv
Source avec Zip Source avec une capture METTRE L'ICÔNE DE SON PROGRAMME DANS LA BARRE DES TACHES par K G
Source .NET (Dotnet) [.NET] IMAGELIST & NOTIFYICON par cbu
Source avec Zip SYSTRAY AMÉLIORER par max12
Source avec Zip METTRE UNE ICON DE VOTRE APPLICATION DS LA BARRE DES TACHES ... par seedorf

Commentaires et avis

Commentaire de Renfield le 23/03/2006 09:38:50 administrateur CS

Super, je suis assez sensible à cela, c'est une fonctionnalité importante qui manque dans beaucoup de sources...

bien joué.

Commentaire de nico1610 le 23/03/2006 11:24:34

Quand je pense que sa fait tellement longtemps que je cherchai ca !!
Super!

Commentaire de moustachu le 23/03/2006 15:26:20

Ah oui, c'est très chouette ça !

Je suis parfois confronté à un autre problème : quand l'appli plante, l'icone reste dans le systray jusqu'à ce qu'on la survole à nouveau. Existe-t-il un code magique pour cela aussi ?

++
Moustachu

Commentaire de clementio le 23/03/2006 15:32:21 administrateur CS

Elle reste car en plantant ton appli ne peux pas appelé

Shell_NotifyIcon SUPPRIME, IconeT

au Form_Unload.

Donc je ne crois pas que ce soit possible. A moins d'avoir un prog externe qui connait le handle de ton icône et qui soit capable de détruire l'icône si ton appli ne tourne plus. Mais là, c'est se compliquer pour pas grand chose!!!!

Commentaire de Renfield le 23/03/2006 15:44:30 administrateur CS

pas faisable, non...

Commentaire de VBEnJ0Y le 23/03/2006 18:03:56

Bien joué clementio !

Connaissais pas ce fameux "TaskbarCreated", super pratique !

++
VBEnJ0Y

Commentaire de Renfield le 23/03/2006 18:12:39 administrateur CS

J'utilise ce message dans un de mes OCX...

Je passe mon temps à réclamer cette fonctionnalité dans les sources qui intègrent une icone en Systray, afin que les codes sources soient a complet a ce point de vue là...

seul Clémentio à repondu à l'appel, bien joué, ça apporte un pluvalue non négligeable, n'est-il pas ? ^^

Commentaire de Renfield le 23/03/2006 18:32:52 administrateur CS

ah bah non, un autre a répondu ^^

http://www.cppfrance.com/code.aspx?ID=36629

enfin, il tente ^^

Commentaire de clementio le 23/03/2006 19:05:34 administrateur CS

Merci les gars!!!

Mais bon, je n'ai fait que matérialiser une idée soufflée par Renfield. Eh oui, c'est lui qui m'a parlé de ça le premier (cf ma source météo).

En tout cas c'est bien mais c'est galère car il faut que je me retape toutes mes source utilisant le systray pour intégrer ça...

Commentaire de jack le 23/03/2006 19:29:25 administrateur CS

Interessant Clementio. Merci

Pour info en passant :
Dans Vista, les fenêtres IE seront indépendantes du bureau et un plantage d'une fenêtre IE ne provoquera que le plantage de cette fenêtre.

Commentaire de moustachu le 24/03/2006 09:03:23

>Clem, Renfield :
Merci pour vos réponses, c'est bien ce qui me semblait.

>Jack :
Quand IE plante, Explorer plante aussi ??

++

Moustachu

Commentaire de Lucyberad le 25/03/2006 18:11:31

euh Jack je sais pas si tu confond mais internet explorer as pour processus IEXPLORER.exe alors que windows a juste explorer.exe

sinon c'est vrai que on pense pas souvent a ce prblm de plantage, c'est un tres bonne source autant sur le code que sur le concept et son utilité, 10/10 (largement merité)

Commentaire de Renfield le 26/03/2006 15:33:50 administrateur CS

y'a une petite chose qui me déplait, clémentio, et que j'ai déjà mentionné, c'est le fait que tu renommes les constantes des APIs.

Commentaire de Elektordi le 26/03/2006 16:09:21

Allez dans les options de dossiers et activez "Ouvrir les fenetres dans des processus différants" (ou un truc du genre dans l'onglet avancé)...

Comme ca la barre de taches ne redémarrera que si le plantage concerne le bureau ou le menu démarrer et tuer un explorateur ne les fermera pas tous !!!

Commentaire de dagdoug le 28/03/2006 17:05:19

c'est super merci
voila un truc que je cherchais depuis longtemps !!

Commentaire de Renfield le 28/03/2006 17:18:51 administrateur CS

suffit de chercher dans La doc : MSDN

Commentaire de kroman le 04/02/2007 17:19:56

merci, super boulot, ça m'a bien dépanné ;)

Commentaire de patrick le 26/03/2008 10:23:19

Super, ce problème devenait de plus en plus génant dans les applis.

Sinon, autre petit truc au niveau du menu que l'on affiche lors du click sur l'icon dans dans le systray : par defaut, une fois affiché, il faut absolument cliquer sur un item du menu pour le faire disparaitre. Pour réglé ce problème, dans la rocedure Form_MouseMove, ajouter "SetForegroundWindow Me.Hwnd" juste avant l'appel de "Me.PopupMenu Me.MnuSysTray..."

Exemple :

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
   Select Case X / Screen.TwipsPerPixelX
     Case BOUTON_CLICK_DROIT:
        Call MnuHelp_Click
     Case BOUTON_CLICK_GAUCHE:
        SetForegroundWindow Me.Hwnd
        Me.PopupMenu Me.MnuSysTray, , , , Me.MnuHelp
  End Select
End Sub


A+ Patrick

Commentaire de JLN le 04/05/2008 11:02:34

si je peux me permettre de compléter...

Si vous utilisez un ctrl ToolBar utilisez un picturebox pour le hwnd sinon les cliques sur l'icone du systray ne seront pas percu. Enfin, moi c'est tout que j'ai trouvé comme alternative...

Bonne prog,
@+ JLN

Commentaire de Renfield le 05/05/2008 10:36:51 administrateur CS

picturebox, fenetre créé a la volée, bouton....

libre a vous, en fait...

Commentaire de Renfield le 05/05/2008 10:37:23 administrateur CS

mais dédiez une fenetre pour ça, hein, pas de Form_MouseMove ^^

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

SYSTRAY APRES PLANTAGE DE EXPLORER.EXE [ par sn0wb0ard3r ] Bonjour tout le monde...Je sais pas si vous avez remarqué, mais quand vous avez une action dans le systray (en bas à droite...) Et que explo Icone dynamique dans le systray [ par Taurus67 ] Alors voila, j'aimerais afficher des nombres de 0 à au moins 999 dans la barre des taches ( j'ai fait un petit programme qui affiche le ping inst Recuperer les icone du systray pour creation dune barre des taches [ par lamouchexp ] VoilaJ'aimerais creer ma propre barre des taches sur windows xp.J'aimerais savoir comment recuperer toutes les icones du systray avec leur menu contex Mettre l'icone du programme dans le SysTray [ par scano93 ] Salut à tous. J'ai fait plusieurs recherches sur le site à propos du SysTray, mais je n'ai rien trouvé de véritable, car les infos systray [ par chasseurdedemon ] salut j'ai crée un programme, j'arrive a le mettre dans le systray mais quand je clique sur son icone (dans le systray) rien ne ce passe je voud Chargement programme [ par lookool ] Mon application se charge au démarrage de windows en mode invisible (tâche de fond).Je souhaiterais que l'application redevienne visible si icone d'impression enregistrement etc... dans internet explorer [ par pierrearnaudh ] bonjour, je fais appel à vous qui dans la généralité me semble expert dans la programmation comparé à moi qui suis un pietre débutant, ce site est gén mettre une icone dans le systray avec vb 2005 express [ par gigatrappeur ] Salut tout le monde,j'ai programmé une petite appli (j'utilise vb 2005 express) et j'aimerais pouvoir mettre une icone dans le systray quand le progra Faire un menu avec le systray [ par TEtnobic ] J'aurai voulu savoir comment on fait pour faire apparaitre un menu lorsque l'on clique sur l'icone du systray.Je possede l'extension systray.ocx qui m Simuler un clic de souris sur un icone du systray [ par legege84 ] Bonjour,J'aimerais avoir le code pour simuler le clique de souris sur une icone du tray... Es-ce possible avec des API?C'est en fait pour faire appara


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,811 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales