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

C# Discussion :

Windows Forms: NotifyIcon événement non déclenché


Sujet :

C#

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Points : 480
    Points
    480
    Par défaut Windows Forms: NotifyIcon événement non déclenché
    Bonjour,

    J'ai un souci d'implémentation en c# concernant les événements liés à un NotifyIcon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     private void InitializeComponent()
    {
      monIcon = new NotifyIcon();
      monIcon.Visible = true;
      monIcon.MouseClick += new MouseEventHandler(monIcon_MouseClick);
    Tout ceci fonctionne très bien, et le clic de la souris est bien détecté.

    Par contre, si l'icone n'est pas visible lors de l'initialisation, impossible de déclencher l'événement de souris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     private void InitializeComponent()
    {
      monIcon = new NotifyIcon();
      monIcon.Visible = false;
      monIcon.MouseClick += new MouseEventHandler(monIcon_MouseClick);
    Et dans une autre fonction (après plusieurs traitements), je voudrais que l'icone soit visible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monIcon.Visible = true;
    Il devient bien visible, par contre, les événements de souris (créés lors de l'initialisation) ne sont pas déclenchés.

    Est ce que quelqu'un pourrait de donner une idée, sur l'erreur ou le mécanisme correct que je dois utiliser?

    Merci d'avance.

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Le problème vient peut-être d'ailleurs. Je viens de faire un essai avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    this.notifyIcon1.Visible = false;
    this.notifyIcon1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon1_MouseDoubleClick);
    this.notifyIcon1.Visible = true;
    et l'événement est bien appelé. Le problème doit venir d'ailleurs.

    Est-il possible que l'objet soit réinstancié par exemple ? Tu peux le détecter facilement en mettant deux points d'arrêt :
    • un point d'arrêt sur la ligne où tu initialises l'événement.
    • un point d'arrêt sur la ligne où tu fais un monIcon.Visible = true


    Lors du premier point d'arrêt, tu génères l'ID de l'objet monIcon :
    • tu places la souris sur monIcon,
    • tu attends que sa valeur s'affiche,
    • tu déplaces la souris sur la valeur, clic droit -> générer l'ID de l'objet))
    • un {$1} doit apparaitre à droite de la valeur de l'objet.
    • tu continues ensuite l'exécution du programme.


    Ensuite, lorsque tu atteins le second point d'arrêt, tu vérifies que l'ID de l'objet est le même. Tu dois voir comme précédemment un {$1}. Si ce n'est pas le cas, c'est que ce n'est pas la même instance de l'objet.

    Autre possibilité, quoique moins probable : tu supprimes le gestionnaire d'événement dans le code.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Points : 480
    Points
    480
    Par défaut
    Bonjour,

    Merci pour votre retour,

    J'ai fait le test que vous proposez et j'ai le même identifiant d'objet.

    J'ai aussi effectuer le test avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    this.notifyIcon1.Visible = false;
    this.notifyIcon1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon1_MouseDoubleClick);
    this.notifyIcon1.Visible = true;
    et dans ce cas, les événements sont aussi correctement déclenchés.

    Pour le cas où je supprimerais le gestionnaire d'événement dans le code, non je ne pense pas, car le code fonctionne avec Visible = true.

    Merci.

  4. #4
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Points : 1 672
    Points
    1 672
    Par défaut
    Hello!
    On peut savoir, à tout hasard, ce qu'il y a dans "monIcon_MouseClick" ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Points : 480
    Points
    480
    Par défaut
    Bonjour,

    Merci pour votre réponse,
    J'appelle une fonction qui ouvre un écran, mais je n'arrive pas jusque là, j'ai mis un breakpoint en début de fonction "monIcon_MouseClick" mais il n'est jamais déclenché (sauf bien sur lorsque l'icone est visible dès le début),

    Cordialement.

  6. #6
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par eric39 Voir le message
    J'ai fait le test que vous proposez et j'ai le même identifiant d'objet.
    Bon, cela ne résout pas le problème, mais cela permet de savoir où il n'est pas.

    Citation Envoyé par eric39 Voir le message
    J'ai aussi effectuer le test avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    this.notifyIcon1.Visible = false;
    this.notifyIcon1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon1_MouseDoubleClick);
    this.notifyIcon1.Visible = true;
    et dans ce cas, les événements sont aussi correctement déclenchés.
    Dans ce cas, peux-tu essayer de faire un projet minimal reproduisant le problème, pour pouvoir ensuite nous le soumettre ?
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Points : 480
    Points
    480
    Par défaut
    Merci.

    Ça me parait compliqué car il se passe beaucoup de choses entre temps, mais en regardant, j'ai vu qu'en fait l'appel à la fonction qui rend visible l'icone est effectué par un Timer.

    Je ne vois pas bien où cela pourrait avoir une incidence, vu que l'icone devient bien visible (sont Text change aussi correctement), seul les événements ne sont plus déclenchés.

    De plus, cela fonctionne si l'icone est visible lors de l'ajout des événements et rendu invisible juste après:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    this.notifyIcon1.Visible = true;
    this.notifyIcon1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon1_MouseDoubleClick);
    this.notifyIcon1.Visible = false;
    Si l'icone est rendu visible après, y compris via un Timer, le code précédent fonctionne.

  8. #8
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    C'est peut-être compliqué, mais indispensable. D'autant plus qu'avec les tests que tu viens de faire, il semblerait que ce soit un bug dans le framework .Net (bien qu'il faille des conditions assez précises pour qu'il se produise). Quoiqu'il en soit, si bug il y a, il sera nécessaire d'avoir un exemple reproductible pour faire une remonté à Microsoft.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Points : 480
    Points
    480
    Par défaut
    Il faudrait que j'upload mon projet minimal, ici directement sur le forum?

  10. #10
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    oui, par exemple
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  11. #11
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Points : 480
    Points
    480
    Par défaut
    Voici l'exemple,

    Si l'on rend Visible l'icone avant l'ajout de l'événement, tout fonctionne.

    Merci pour ton aide!
    Fichiers attachés Fichiers attachés

  12. #12
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bon, je pense que j'ai compris un peu ce qui se passe.

    Le soucis vient du fait que tu appelles le code monIcon.Visible=true dans un thread qui n'est pas celui qui exécute la commande Application.Run().

    En regardant un peu la source de NotifyIcon, on se rend compte que lors du premier affichage de l'icône, un gestionnaire d’événements WndProc est mis en place (gestion des événements bas niveau de windows, comme les événements souris). Du coup, si cela est fait depuis un autre thread, cela provoque quelques soucis...

    Afin de palier au soucis, il faut s'assurer que le NotifyIcon est affiché dans le thread principal (celui qui exécute Application.Run()). Le code suivant suffit, au niveau de la méthode InitializeComponent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    monIcon.Visible = true;
    monIcon.Visible = false;
    Ainsi, lors des affichages ultérieurs, il n'y aura pas de soucis car le gestionnaire d'événements WndProc aura déjà été correctement enregistré, et les événements seront donc bien distribués.

    Maintenant, faut-il parler de bug ? J'ai envie de dire non, d'autant plus que la MSDN indique bien que les propriétés et méthodes non statiques ne sont pas thread safe...
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  13. #13
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Points : 480
    Points
    480
    Par défaut
    OK, je vais faire comme cela.

    Merci beaucoup pour ton aide, les explications et le temps passé!

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

Discussions similaires

  1. [Débutant] Création d'une instance pour les windows form oui ou non?
    Par cmo1979 dans le forum VB.NET
    Réponses: 3
    Dernier message: 28/06/2013, 13h39
  2. [Graphics View] Évènement QGraphicsItem non déclenché
    Par Inouee dans le forum Qt
    Réponses: 6
    Dernier message: 26/02/2010, 11h30
  3. mouseMoved -> pertes ou événements non déclenchés
    Par karibouk dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 16/10/2006, 15h55
  4. [VB.NET] Type non défini quand j'appelle un Windows Form ?
    Par beegees dans le forum Windows Forms
    Réponses: 4
    Dernier message: 12/06/2006, 11h12
  5. Gestionnaires d'évènements non déclenchés
    Par Sylvain James dans le forum XMLRAD
    Réponses: 7
    Dernier message: 19/04/2006, 18h14

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