IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Supprimer une icône dans systray [AC-2003]


Sujet :

VBA Access

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 185
    Points : 173
    Points
    173
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    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 : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Pour supprimer l'icône sans supprimer l'item de la zone de notifications, j'ai ajouté cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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+

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 185
    Points : 173
    Points
    173
    Par défaut
    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.

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    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 : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    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+

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 185
    Points : 173
    Points
    173
    Par défaut
    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.

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 185
    Points : 173
    Points
    173
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/09/2007, 23h32
  2. Supprimer une ligne dans un fichier
    Par tsing dans le forum Linux
    Réponses: 4
    Dernier message: 06/02/2006, 14h45
  3. [C#] Comment supprimer une ligne dans DataGrid ?
    Par BAUDIER dans le forum ASP.NET
    Réponses: 2
    Dernier message: 20/07/2004, 16h03
  4. Supprimer une ligne dans un fichier
    Par sbeu dans le forum Langage
    Réponses: 3
    Dernier message: 13/05/2003, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo