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

Windows Forms Discussion :

[C#]Curiosité sur KeyDown et KeyPress


Sujet :

Windows Forms

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut [C#]Curiosité sur KeyDown et KeyPress
    Bonjour,

    En cours de debuggage j'ai par facilité affiché deux valeurs par MessageBox, un dans l'événement intercepté KeyDown d'un textbox et l'autre dans l'événement KeyPress.

    Je ne m'attendais pas à rencontrer le moindre problème sur ce point, il s'agit de base élémentaire. Or, j'ai reçu mes message dans l'ordre inverse de celui auquel je m'attendais, à savoir celui de l'ordre annoncé des événements KeyDown puis KeyPress.

    J'ai donc écrit "bêtement" ceci pour m'en assurer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            private void textBox1_KeyDown(object sender, KeyEventArgs e)
            {
                MessageBox.Show("Down");
            }
     
            private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
            {
                MessageBox.Show("Press);
            }
    Et là, j'ai reçu d'abord "Press" et ensuite seulement "Down".
    Comme ça me semblait illogique, j'ai déclaré une variable globale "i" et j'ai écrit ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            private void textBox1_KeyDown(object sender, KeyEventArgs e)
            {
                MessageBox.Show("Down: " + i.ToString());
                i++;
            }
     
            private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
            {
                MessageBox.Show("Press: " + i.ToString());
                i++;
            }
    Et contre toute attente, j'ai reçu dans l'ordre :

    - Press : 0
    - Down: 0

    et à la seconde touche frappée :
    - Press: 2
    - Down: 2

    Donc, mon premier message a été construit, puis le second, et ensuite seulement les 2 incrémentations de i ont été faites. ???

    J'ai alors testé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            private void textBox1_KeyDown(object sender, KeyEventArgs e)
            {
                i++;
                MessageBox.Show("Down: " + i.ToString());
            }
     
            private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
            {
                i++;
                MessageBox.Show("Press: " + i.ToString());
            }
    et cette fois, j'ai obtenu :
    - Press: 2
    - Down: 1

    J'en déduis l'ordre suivant :

    1)Incrémentation de i dans KeyDown
    2) Création du MessageBox de KeyDown
    3) Incrémentation de i dans KeyPress
    4) Création du MessageBox de KeyPress
    5) Affichage du MessageBox de KeyPress
    6) Affichage du MessageBox de KeyDown

    Une âme charitable pourrait-elle m'expliquer le phénomène en jeu?

    Merci d'avance,
    Claude

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Le fait de passer par des message box risque de fausser pas mal de choses, parce qu'une nouvelle fenêtre apparaît et peut perturber tout ça.

    Que donnent ces tests en remplaçant tes MB.Show par le stockages (par exemple) d'un ensemble de chaînes dans une liste, que tu afficherait ensuite ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private List<string> messages = new List<string>();
    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        messages.Add("Down");
    }
     
    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        messages.Add("Press");
    }
    Et j'avais trouvé ce lien au cours de mes pérégrinations : http://blogs.msdn.com/jfoscoding/arc...24/359334.aspx , qui détaille pas mal de choses sur la gestion du clavier des winforms.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut
    Que donnent ces tests en remplaçant tes MB.Show par le stockages (par exemple) d'un ensemble de chaînes dans une liste, que tu afficherait ensuite ?
    Ben justement, si tu remarques, c'est ce que j'ai fait avec ma variable globale "i". Down est bien appelé avant Press. Si j'empile un texte, c'est ce que je vais constater également.

    Je comprends que l'ouverture d'un messageBox puisse perturber le synchronisme de tout ceci, mais là où je cerne mal ce qui se passe, c'est que le messagebox dans la méthode down est bien créé avant celui de la méthode press, mais qu'il ne s'affiche cependant qu'après, et de plus SANS bloquer KeyPress.

    Ca revient à dire que les messagesbox peuvent être envoyés dans un ordre différent de celui de leur création, et vu qu'il n'y a qu'un seul thread dans ce mini-programme de test, j'aurais aimé savoir ce qui se passe, afin d'éviter que ça ne se produise dans un contexte beaucoup plus gênant que la simple apparition d'un message.

    Encore que, si les messages arrivent à l'utilisateur dans le désordre, ça empêche par exemple d'envoyer des messagebox demandant un choix à l'utilisateur : imagine que j'aie posé une question à l'utilisateur dans KeyDown via un messagebox en fonction d'une touche spécifique appuyée et que je ne reçoive sa réponse qu'après que KeyPress aie été exécuté, ça pourrait foirer la logique d'un programme).

    Et j'avais trouvé ce lien au cours de mes pérégrinations : http://blogs.msdn.com/jfoscoding/arc...24/359334.aspx , qui détaille pas mal de choses sur la gestion du clavier des winforms.
    Merci, je vais aller regarder ça.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    N'utilise jamais de messagebox pour debugger du code d'interaction avec l'utilisateur... ça fout une m***e pas possible
    Utilise plutôt des Debug.WriteLine, ça sert à ça...

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut
    N'utilise jamais de messagebox pour debugger du code d'interaction avec l'utilisateur... ça fout une m***e pas possible
    Utilise plutôt des Debug.WriteLine, ça sert à ça...
    J'en suis conscient, merci

    Mais ma question ne portait pas sur le debuggage, je voulais comprendre la raison de ce fonctionnement parce que je pourrais fort bien avoir un programme qui en posant une question à un utilisateur via un MessageBox se retrouverait confronté au même phénomène. Bref, ma question n'est pas ici pour me débloquer face à un problème, mais juste pour comprendre le mécanisme.

  6. #6
    Membre très actif
    Profil pro
    Expert technique .NET
    Inscrit en
    Août 2007
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Expert technique .NET

    Informations forums :
    Inscription : Août 2007
    Messages : 272
    Par défaut
    Salut,

    Si tu mets un point d'arrêt sur les deux affichages de tes MessageBox, tu verras qu'il y passe bien dans l'ordre (d'abord Down, puis Press).
    De même, si tu rajoutes une autre TexteBox que tu remplis par concaténation dans tes deux événements, tu verras aussi qu'ils sont dans le bon ordre (cela revient à l'incrémentation de ta variable i).

    Explication simple : C# va traiter tous les messages claviers avant rendre la main à l'utilisateur. Donc :
    1. il fait le KeyDown et affiche bien le MessageBox.
    2. il traite tout de suite le KeyPress et affiche la MessageBox par dessus la précédente, qui ne sera visible que quand tu auras validé celle du KeyPress.



    J'espère que cela est clair et va t'aider.
    Bonne chance

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut
    Merci

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/02/2012, 20h33
  2. Difference entre KeyDown et KeyPress
    Par olibara dans le forum C#
    Réponses: 5
    Dernier message: 15/10/2008, 11h27
  3. Question de curiosité sur du code
    Par defluc dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 08/09/2007, 16h12
  4. Curiosité sur temps d'executions
    Par wonderyan dans le forum C
    Réponses: 14
    Dernier message: 09/03/2007, 16h38
  5. Curiosité sur le prix d'un projet.
    Par snoopydo dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 26/01/2007, 09h50

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