none
Détecter un appui long sur une touche du smartphone sous windows 6.1 RRS feed

  • Question

  • Bonjour,

    Je dois programmer une application  sous windows mobile en c#, dans le but de mon projet BTS, et je ne trouve pas de solution pour détecter un appui long sur une touche du smartphone.

    J'arrive à faire fonctionner un appui court, mais pas un long.

    J'etais sur une piste:

     

      public void FormAccueil_KeyDownEnter(object sender, KeyEventArgs e)
      {
       if (e.KeyCode == System.Windows.Forms.Keys.Up)
       {
        AppuiEntree = DateTime.Now;
       }
      }
    
      public void FormAccueil_KeyUpEnter(object sender, KeyEventArgs e)
      {
       if (e.KeyCode == System.Windows.Forms.Keys.Up)
       {
        
        t difference = DateTime.Now - AppuiEntree;
    
        if (difference.Milliseconds >= 3)
         MessageBox.Show("essai", "long");
        else
         MessageBox.Show("essai", "court");
        
       }
      }
    

     

     

    Mais évidemment cela ne fonctionne pas, il détecte seulement l'appui court!

     

    Pouvez vous m'aider svp?

    Merci.


    jeudi 21 avril 2011 15:21

Réponses

  • Bonjour,

    Un mélange avec keyup dans KeyDownEnter (donc AppuiEntree n'est peut-être pas initialisé ou c'est une faute de frappe dans le message (?) ce qui me laisse supposer également le t au lieu de TimeSpan sans doute) ? Egalement je suis un peu surpris que la frontière soit à 3 *millisecondes* ce qui n'est pas si long que cela !!

    Sinon une approche pour déboguer serait par exemple d'imprimer la valeur de t et de voir quelles sont les valeurs collectées. Si la valeur est manifestement incorrecte voir ensuite pourquoi le calcul produit une valeur fausse (Now est sans doute bon, donc AppuiEntree est probablement faux) etc... ce qui devrait vous permettre de trouver le problème par vous même...

    Mon record est de 42 millisecondes ;-)

    Donc je pense que vous verrez tout de suite en affichant t ce que ne va pas mais je voulais apporter une petite précision. Ne pas utiliser à nouveau Milliseconds une fois l'erreur trouvé, cela retourne en effet la partie "Milliseconds" de cette durée (même si c'est 8 jours 3 heures et 500 millisecondes). Utiliser plutôt TotalMilliseconds pour avoir la durée totale exprimée en millisecondes.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    jeudi 21 avril 2011 17:49
    Modérateur
  • Bonjour,

    Donc comme un point d'arrêt ou un "Debug.WriteLine" dans KeyDown permettrait de le voir, le problème est que maintenir la touche appuyée génère plusieurs évènements KeyDown (répétition automatique des touches au clavier) donc AppuiEntree n'est pas le premier mais le dernier évènement et quand on relâche la touche on vient toujours d'avoir eu un keydown donc la différence est nulle ou en tout cas serait toujours très petite.

    Au final je ferais qq chose comme :

        private void FormAccueil_KeyDown(object sender, KeyEventArgs e)
        {
          if ((e.KeyCode == System.Windows.Forms.Keys.Up))
          {
            if (AppuiEntree==DateTime.MinValue) AppuiEntree = DateTime.Now;
          }
        }
    
        private void FormAccueil_KeyUp(object sender, KeyEventArgs e)
        {
          if (e.KeyCode == System.Windows.Forms.Keys.Up)
          {
            Debug.WriteLine("KeyUp");
            TimeSpan difference = DateTime.Now - AppuiEntree;
    
            if (difference.TotalMilliseconds >= 500)
              Debug.WriteLine("Long : "+difference.TotalMilliseconds);
            else
              Debug.WriteLine("Court : "+difference.TotalMilliseconds);
            AppuiEntree = DateTime.MinValue;
          }
        }
    

    Donc dans KeyDown je ne modifie AppuiEntree que si égal à la valeur par défaut DateTime.MinValue ce qui permet d'avoir la date/heure du premier évènement KeyDown.

    Dans KeyUp je fais le calcul et je remets AppuiEntree à DateTime.MinValue pour que le prochain KeyDown puisse modifier à nouveau AppuiEntree.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse Remi_G vendredi 29 avril 2011 14:45
    jeudi 28 avril 2011 16:24
    Modérateur

Toutes les réponses

  • Bonjour,

    Un mélange avec keyup dans KeyDownEnter (donc AppuiEntree n'est peut-être pas initialisé ou c'est une faute de frappe dans le message (?) ce qui me laisse supposer également le t au lieu de TimeSpan sans doute) ? Egalement je suis un peu surpris que la frontière soit à 3 *millisecondes* ce qui n'est pas si long que cela !!

    Sinon une approche pour déboguer serait par exemple d'imprimer la valeur de t et de voir quelles sont les valeurs collectées. Si la valeur est manifestement incorrecte voir ensuite pourquoi le calcul produit une valeur fausse (Now est sans doute bon, donc AppuiEntree est probablement faux) etc... ce qui devrait vous permettre de trouver le problème par vous même...

    Mon record est de 42 millisecondes ;-)

    Donc je pense que vous verrez tout de suite en affichant t ce que ne va pas mais je voulais apporter une petite précision. Ne pas utiliser à nouveau Milliseconds une fois l'erreur trouvé, cela retourne en effet la partie "Milliseconds" de cette durée (même si c'est 8 jours 3 heures et 500 millisecondes). Utiliser plutôt TotalMilliseconds pour avoir la durée totale exprimée en millisecondes.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    jeudi 21 avril 2011 17:49
    Modérateur
  • Bonjour, Remi_G,

    Est-ce que les explications de Patrice vous ont aidé à résoudre votre problème ? Merci pour partager les résultats avec nous, afin que d'autres personnes avec le même problème puissent profiter de ces solutions.

    Cordialement,

    Cipri
    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mardi 26 avril 2011 07:09
  • Bonjour,

    Merci d'avoir repondu.

    j'ai resolu les probleme de faute de frappe, j'ai aussi regardé les valeurs et j'obtiens une valeur pour "appuiEntree" et aussi pour le "date.now" mais j'obtiens 0 pour "difference".

    Donc ca veut dire que l'operation ne se fait pas?

    private void FormAccueil_KeyDown(object sender, KeyEventArgs e)
        {
          if ((e.KeyCode == System.Windows.Forms.Keys.Up))
          {
            AppuiEntree = DateTime.Now;     
          }
          
    
        }
    
        private void FormAccueil_KeyUp(object sender, KeyEventArgs e)
        {
          if (e.KeyCode == System.Windows.Forms.Keys.Up)
          {
            TimeSpan difference = DateTime.Now - AppuiEntree;
    
            if (difference.TotalMilliseconds >= 500)
              MessageBox.Show("essai", "long");
            else
              MessageBox.Show("essai", "court");
    
          }
        }
    
    
    Merci

    jeudi 28 avril 2011 14:31
  • Bonjour,

    Donc comme un point d'arrêt ou un "Debug.WriteLine" dans KeyDown permettrait de le voir, le problème est que maintenir la touche appuyée génère plusieurs évènements KeyDown (répétition automatique des touches au clavier) donc AppuiEntree n'est pas le premier mais le dernier évènement et quand on relâche la touche on vient toujours d'avoir eu un keydown donc la différence est nulle ou en tout cas serait toujours très petite.

    Au final je ferais qq chose comme :

        private void FormAccueil_KeyDown(object sender, KeyEventArgs e)
        {
          if ((e.KeyCode == System.Windows.Forms.Keys.Up))
          {
            if (AppuiEntree==DateTime.MinValue) AppuiEntree = DateTime.Now;
          }
        }
    
        private void FormAccueil_KeyUp(object sender, KeyEventArgs e)
        {
          if (e.KeyCode == System.Windows.Forms.Keys.Up)
          {
            Debug.WriteLine("KeyUp");
            TimeSpan difference = DateTime.Now - AppuiEntree;
    
            if (difference.TotalMilliseconds >= 500)
              Debug.WriteLine("Long : "+difference.TotalMilliseconds);
            else
              Debug.WriteLine("Court : "+difference.TotalMilliseconds);
            AppuiEntree = DateTime.MinValue;
          }
        }
    

    Donc dans KeyDown je ne modifie AppuiEntree que si égal à la valeur par défaut DateTime.MinValue ce qui permet d'avoir la date/heure du premier évènement KeyDown.

    Dans KeyUp je fais le calcul et je remets AppuiEntree à DateTime.MinValue pour que le prochain KeyDown puisse modifier à nouveau AppuiEntree.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse Remi_G vendredi 29 avril 2011 14:45
    jeudi 28 avril 2011 16:24
    Modérateur
  • Bonjour,

    Merci beaucoup de votre aide, cela faisait plusieurs jours que je cherchais une solution !

    Je vais maintenant l'adapter à mon projet!

    Merci et à bientôt. :D

    vendredi 29 avril 2011 14:49