Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/12/2011, 12h18   #1
Membre habitué
 
Homme Georges HAROT
Inscription : août 2003
Messages : 122
Détails du profil
Informations personnelles :
Nom : Homme Georges HAROT
Âge : 53
Localisation : Belgique

Informations forums :
Inscription : août 2003
Messages : 122
Points : 104
Points : 104
Envoyer un message via MSN à Geache
Par défaut Supprimer une icône dans systray

Bonjour,

Je dois appliquer une modification dans une application pour que, lorsqu'un événement précis survient, l'icône de l'application clignote dans la barre des tâches.

Notre application tournant en tâche de fond par rapport à une autre application, le but est de prévenir l'utilisateur qu'une action est à réaliser d'urgence dans la nôtre.

J'ai chipoté un moment avec la bibliothèque FlashWindow, puis avec FlashWindowEx. Mais le résultat n'est pas satisfaisant.

Puis, en explorant les ressource de developpez, je suis tombé sur le tutoriel de Arkham46 :

http://www.developpez.net/forums/d59...ation-systray/

Celui-ci répond parfaitement à ce que je dois faire. Je peux programmer une icône clignotante dans le systray. Je peux même lui affecter une infobulle. Tout est nickel.

Mais j'ai quand même un soucis et je ne vois pas comment le régler :

Dans le systray, que ce soit sous XP ou sous Win7, l'icône créée est décalée à chaque clignotement.

Sous Win7, ce n'est pas vraiment un problème parce que le systray est dans un cadre indépendant (C'est gênant, mais ce n'est pas un problème), mais sous XP, cela provoque une réduction progressive de ma barre des tâches. Ce qui est un effet indésiré.

En explorant les méthodes de la classe créée par Arkham46, j'ai essayé de supprimer l'icône, après chaque clignotement, dans le systray à l'aide des méthodes :

HideSysTray
HideFormInTaskBar

Quelque chose m'échappe ou je ne place pas mon appel de fonction correctement, mais je ne parviens pas à arrêter ce phénomène intempestif.

Voici le timer que j'ai programmé dans mon formulaire utilisant la classe de Arkham :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Private Sub Form_Timer()
On Error GoTo ErrorHandling
    ' Récupération des numéros de processus des fenêtres
'    Debug.Print ipProcApp
    ipProcActive = GetActiveWindow
    ipProcForeground = GetForegroundWindow
'    Debug.Print "Application : " & ipProcApp _
        & "Form : " & ipProcForm _
        & " " & "Active : " & ipProcActive _
        & " " & "Foreground : " & ipProcForeground
 
    ' Si la fenêtre du formulaire n'est pas la fenêtre active
    ' Faire clignoter une icône dans le systray
 
    If ipProcForm <> ipProcForeground Then
'        Debug.Print "Access en fond"
        'DoCmd.Beep
        Form_FrmSysTray.ShowFormInTaskBar Me
 
        If blnFlash Then
            DoCmd.OpenForm "FrmSysTray", acNormal, , , , acHidden
        Else
            Form_FrmSysTray.HideFormInTaskBar Me
            DoCmd.Close acForm, "FrmSysTray"
        End If
        blnFlash = Not (blnFlash)
 
    Else
    ' Si la fenêtre du formulaire est la fenêtre active,
    ' faire clignoter la fenêtre.
 
'        Debug.Print "Access en avant"
        Call FlashWindow(ipProcForeground, True)
    End If
FinSub:
    Exit Sub
ErrorHandling:
    '   Gestion d'erreur.
    '   !!! Attention !!! A modifier pour utiliser la procédure
    '   d'erreur call errorsolution habituelle.
    If Err.Number <> 0 Then
        MsgBox Err.Number & vbCrLf & Err.Description
    End If
    Resume FinSub
End Sub
Si quelqu'un pouvait me dire quelle idiotie je fais, je lui brulerais un cierge.

Merci.
Geache est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 08h37   #2
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonjour,

Pour supprimer l'icône sans supprimer l'item de la zone de notifications, j'ai ajouté cette fonction :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
'---------------------------------------------------------------------------------------
' Modification de l'icone - Enlever l'icone
'---------------------------------------------------------------------------------------
Public Function RemoveIcon() As Boolean
    On Error GoTo Gestion_Erreurs
 
    ' Supprime l'ancienne icone
    If gNID.hIcon <> 0 Then DestroyIcon gNID.hIcon
    ' Rempli la structure pour l'API
    With gNID
        ' NIF_ICON pour affichage icone
        .uFlags = NIF_ICON
        .hIcon = 0   ' 0 = pas de handle d'icone
    End With
    ' Modifie l'icone
    RemoveIcon = (Shell_NotifyIcon(NIM_MODIFY, gNID) <> 0)
 
    On Error GoTo 0
    Exit Function
Gestion_Erreurs:
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") dans la fonction RemoveIcon du module Form_FrmSysTray"
    RemoveIcon = False
End Function
La procédure telle que je la vois :
  1. Initialisation
    On crée l'item dans la zone de notifcation avec DisplaySysTray
    Ensuite on affiche l'icône avec PutIconDefault par exemple.
  2. Clignotement
    Dans la procédure événementielle Form_Timer on alterne entre RemoveIcon et PutIconDefault.
    De cette manière on a toujours l'item dans la zone de notification, mais avec ou sans icône.
  3. Fin
    Quand on a plus besoin de l'item dans la zone de notifications, on le supprime avec HideSysTray.
A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 09h23   #3
Membre habitué
 
Homme Georges HAROT
Inscription : août 2003
Messages : 122
Détails du profil
Informations personnelles :
Nom : Homme Georges HAROT
Âge : 53
Localisation : Belgique

Informations forums :
Inscription : août 2003
Messages : 122
Points : 104
Points : 104
Envoyer un message via MSN à Geache
Bonjour,

Oui, ça, c'est ce que j'ai compris aussi. Le soucis, c'est que, tant que le clignotement est actif, on a des "capsules" d'icônes blanches qui se multiplient à l'envi dans la zone de notification.

Ce que je cherche à faire, donc, c'est que, à la fin d'un cycle de clignotement, l'icône soit complètement supprimée de la zone de notification. Et c'est là que je coince.

Merci pour ta réponse.

PS : Le HideSystray est la procédure événementielle sur fermeture du formulaire FrmSystray. Je pensais donc que l'icône serait supprimée à ce moment. Mais ce n'est pas le cas chez moi.
Geache est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 19h09   #4
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonsoir,

Peut-être que la différence est que moi je ne fais pas clignoter en faisant de multiples ouvertures/fermetures.
Je n'ouvre qu'une fois le formulaire contenant de code pour l'icône de la zone de notifications.
Ensuite je me contente de mettre/enlever l'icône à afficher.

Je joins mon exemple au cas où ... bd_systray_clignt.zip

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 21h49   #5
Membre habitué
 
Homme Georges HAROT
Inscription : août 2003
Messages : 122
Détails du profil
Informations personnelles :
Nom : Homme Georges HAROT
Âge : 53
Localisation : Belgique

Informations forums :
Inscription : août 2003
Messages : 122
Points : 104
Points : 104
Envoyer un message via MSN à Geache
Bonsoir,

Je dois dire que même quand tu en as parlé plus tôt, ça n'a pas tilté dans ma tête. Juste ajouter l'icône et la faire clignoter par un affichage/non affichage, c'est en te relisant j'ai compris ce que tu voulais dire. Je vais essayer demain cette idée.

Merci de ton aide.
Geache est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 08h39   #6
Membre habitué
 
Homme Georges HAROT
Inscription : août 2003
Messages : 122
Détails du profil
Informations personnelles :
Nom : Homme Georges HAROT
Âge : 53
Localisation : Belgique

Informations forums :
Inscription : août 2003
Messages : 122
Points : 104
Points : 104
Envoyer un message via MSN à Geache
Bonjour,

@Led : La méthode que tu préconises est effectivement celle qu'il faut utiliser pour résoudre mon soucis. Je l'ai testée hier soir, elle fonctionne nickel.

Merci mille fois de ton aide.

Geache
Geache est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h49.


 
 
 
 
Partenaires

Hébergement Web