Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2903 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Actions selon la durée de pression d'une touche

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Actions selon la durée de pression d'une touche

n°1861487
chiqitos
Posté le 14-03-2009 à 13:39:45  profilanswer
 

Alors déja, connaissez vous le morse?
Je voudrais le retranscrire en c# donc en gros quand j'appuie sur la barre d'espace plus de "n" temps je veux un certain caractère et si c'est moins de "n" temps je veux afficher un autre caractère.
SI quelqu'un a des idées je suis PRENEUR!!!!! je planche dessus depuis un certain temps mais rien d'interessant malheuresement! Merci beaucoup
 
voici mon essai, mais rien ne s'affiche :  
 

Code :
  1. private void textBox2_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
  2.         {
  3.             Stopwatch Temps = new Stopwatch();
  4.             if (e.KeyCode == Keys.Back)
  5.             {
  6.                 Temps.Start();
  7.             }
  8.             if (e.KeyData != Keys.Back)
  9.             {
  10.                 Temps.Stop();
  11.             }
  12.             TimeSpan ts = Temps.Elapsed;
  13.             if (ts.Milliseconds > 1000)
  14.             {
  15.                 textBox2.Text = ".";
  16.             }
  17.             else
  18.             {
  19.                 textBox2.Text = "-";
  20.             }
  21.         }


 
Merci de votre aide

mood
Publicité
Posté le 14-03-2009 à 13:39:45  profilanswer
 

n°1861734
haazheel
Posté le 15-03-2009 à 13:02:22  profilanswer
 

Pourquoi ne pas mettre ton Stopwatch dans la déclaration de ta Form, l'activer dans le KeyDown, l'arrêter dans le KeyUp, et de là récupérer la valeur du Stopwatch et mettre à jour ton textBox?


---------------
Another .Net Blog
n°1861735
moi23372
Posté le 15-03-2009 à 13:21:04  profilanswer
 

oui faut traiter les deux events.
KeyDown et KeyUp


---------------
quand un homme raisonne mal c'est qu'il n'a pas les données pour raisonner mieux (diderot)
n°1861798
chiqitos
Posté le 15-03-2009 à 17:49:47  profilanswer
 

Donc après des recherches, Déja je prends F3 comme touche d'appui!
j'ai ça :  
 

Code :
  1. private DateTime t1;
  2.         private bool isKeyDown = false;
  3.         private void textBox2_KeyDown(object sender, KeyEventArgs e)
  4.         {
  5.             if (!isKeyDown && e.KeyCode == Keys.F3)
  6.             {
  7.                 isKeyDown = true;
  8.                 t1 = DateTime.Now;
  9.             }
  10.         }
  11.         private void textBox2_KeyUp(object sender, KeyEventArgs e)
  12.         {
  13.             if (isKeyDown)
  14.             {
  15.                 isKeyDown = false;
  16.                 WriteCode(sender, DateTime.Now - t1);
  17.             }
  18.         }
  19.         private void WriteCode(object sender, TimeSpan tps)
  20.         {
  21.             String toWrite;
  22.             if (tps.TotalMilliseconds >= 1000)
  23.                 toWrite = "-";
  24.             else
  25.                 toWrite = ".";
  26.             textBox2.Text = toWrite;
  27.         }


 
 
Ca compile,s'execute mais ne fait rien quand j'appuie sur F3, des idées?

n°1861829
haazheel
Posté le 15-03-2009 à 19:02:41  profilanswer
 

Et quand en debug, tu arrives pas à voir ce qui se passe (pas bien)?


---------------
Another .Net Blog
n°1861900
chiqitos
Posté le 15-03-2009 à 22:15:55  profilanswer
 

A vrai dire, je ne connais pas très bien la programmation donc quand tu m parles de debug, ça ne me dit rien dsl. Le problème c'est que le prog ne rentre même pas dans la première fonction, j'ai mis un printf (enfin l'équivalent) dans le if dans la 1ère fonction, j"appuie sur f3 et rien ne s'affiche. Il me manque un je ne sais quoi qui m'énerve!

n°1861905
Je@nb
Kindly give dime
Posté le 15-03-2009 à 22:33:17  profilanswer
 

Le F3 tu le fais bien qd tu es sur ta texbox2 ?

n°1862004
haazheel
Posté le 16-03-2009 à 10:13:40  profilanswer
 

chiqitos a écrit :

Il me manque un je ne sais quoi qui m'énerve!


Fais des recherches pour ce que c'est que le mode debug, tu verras que ça pourra t'aider grandement  :D  
 
Et comment tu sais que tu ne rentres pas dans la première fonction d'abord?


---------------
Another .Net Blog
n°1862049
chiqitos
Posté le 16-03-2009 à 12:37:58  profilanswer
 

Oui, j'appuie bien sur f3 dans la textbox2.
Sinon merci pour le debug, je me renseignerai.
 
Alors pour le fait que je ne rentre pas dans la première fonction, voici mon code :  
 

Code :
  1. private DateTime t1;
  2.         private bool isKeyDown = false;
  3.         private void textBox2_KeyDown(object sender, KeyEventArgs e)
  4.         {
  5.             if (!isKeyDown && e.KeyCode == Keys.Control)
  6.             {
  7.                 isKeyDown = true;
  8.                 textBox2.Text = "test";
  9.                 t1 = DateTime.Now;
  10.             }
  11.         }


 
Donc normalement, si j'appuie sur control dans la textBox2, le mot test devrait apparaitre dans la textbox2, non? Et bah quand j'essaye rien ne se fait.


Message édité par chiqitos le 16-03-2009 à 12:39:06
n°1862183
haazheel
Posté le 16-03-2009 à 17:20:41  profilanswer
 

Code :
  1. private DateTime time;
  2.         private bool pressed;
  3.         private void textBox1_KeyDown(object sender, KeyEventArgs e)
  4.         {
  5.             if (e.KeyCode == Keys.F3 && !pressed)
  6.             {
  7.                 time = DateTime.Now;
  8.                 pressed = true;
  9.             }
  10.         }
  11.         private void textBox1_KeyUp(object sender, KeyEventArgs e)
  12.         {
  13.             if (e.KeyCode == Keys.F3)
  14.             {
  15.                 TimeSpan holdTime = DateTime.Now.Subtract(time);
  16.                 if (holdTime.TotalMilliseconds >= 1000)
  17.                 {
  18.                     textBox1.Text += "-";
  19.                 }
  20.                 else
  21.                 {
  22.                     textBox1.Text += ".";
  23.                 }
  24.                 pressed = false;
  25.             }
  26.         }


L'astuce ici est que tant que tu gardes F3 appuyé, l'événement KeyDown est appelé, et donc time prend à chaque fois la même valeur, ce qui fait que tu auras toujours un temps < 1000ms entre le moment où tu relaches la touche et celui où l'évènement OnKeyUp est appelé. D'où le flag pressed qui se charge de ne pas mettre à jour le temps si la touche est déjà enfoncée...


---------------
Another .Net Blog
mood
Publicité
Posté le 16-03-2009 à 17:20:41  profilanswer
 

n°1862227
chiqitos
Posté le 16-03-2009 à 18:59:14  profilanswer
 

Merci pour ces précisions, mais cela marche t-il chez toi? j'essaye encore en laissant des traces (printf) mais rien ne s'affiche.  
Tu es sûr de ton : TimeSpan holdTime = DateTime.Now.Subtract(time); ?  
Je ne connaissais pas. Merci ;)

n°1862256
haazheel
Posté le 16-03-2009 à 20:22:27  profilanswer
 

Oui, je suis sûr, et oui ça marche :)


---------------
Another .Net Blog
n°1862280
chiqitos
Posté le 16-03-2009 à 21:05:52  profilanswer
 

Donc chez toi ça marche, et chez moi non... :D
 
Alors s'il te plaît, vois-tu une erreur (même surement conne du fait que je commence la programmation) dans mon code:  
 

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Windows.Forms;
  10. using SpeechLib;
  11. namespace MorseC
  12. {
  13.     public partial class Form1 : Form
  14.     {
  15.         public Form1()
  16.         {
  17.             InitializeComponent();
  18.         }
  19.        
  20.  
  21.         private DateTime time;
  22.         private bool pressed;
  23.  
  24.         private void textBox1_KeyDown(object sender, KeyEventArgs e)
  25.         {
  26.             if (e.KeyCode == Keys.F3 && !pressed)
  27.             {
  28.                     time = DateTime.Now;
  29.                     pressed = true;
  30.              }
  31.         }
  32.  
  33.         private void textBox1_KeyUp(object sender, KeyEventArgs e)
  34.         {
  35.                if (e.KeyCode == Keys.F3)
  36.                {
  37.                    TimeSpan holdTime = DateTime.Now.Subtract(time);
  38.  
  39.                    if (holdTime.TotalMilliseconds >= 1000)
  40.                    {
  41.                       textBox1.Text += "-";
  42.                    }
  43.                    else
  44.                    {
  45.                        textBox1.Text += ".";
  46.                    }
  47.  
  48.                    pressed = false;
  49.                }
  50.          }
  51.     }
  52. }


 
J'ai supprimé les autres fonctions de ce code pour simplifier la vision. Vois tu quelque chose?

n°1862351
Tarabiscot​e
Posté le 17-03-2009 à 08:51:16  profilanswer
 

Je vais dire quelque chose de bête mais tu as rajouté tes méthodes aux évènements KeyDown et KeyUp de ton textBox ?
 
Bon après comme dit plus haut ca serait plus simple de mettre un breakpoint au début de chaque méthode et de vérifier si elles sont bien exécutées en debug.
 
PS: Tu as bien sélectionné ton textBox avant d'appuyer sur une touche ?


Message édité par Tarabiscote le 17-03-2009 à 13:37:06
n°1862548
chiqitos
Posté le 17-03-2009 à 16:04:12  profilanswer
 

Quand tu perles des méthodes, c'est mettre:  
 
public event KeyEventHandler KeyUp;
public event KeyEventHandler KeyDown;
 
???  
 
D'ailleurs cela se met où? Entre les fonctions?  
 
Sinon à chaque fois, je selectionne bien le bon textBox avant d'appuyer sur la touche ;) Merci

n°1862567
haazheel
Posté le 17-03-2009 à 16:19:52  profilanswer
 

Dans l'éditeur, tu dois sélectionner ton textbox, aller dans ses propriétés, et double cliquer sur les évènements KeyUp et KeyDown, ce qui aura pour effet de créer automatiquement les fonctions textBox1_KeyUp et textBox1_KeyDown.
 
Pour savoir si tu passes bien dans ces fonctions, tu dois cliquer au niveau de la première ligne de chaque fonction sur le bandeau tout à gauche de ta fenêtre de code, ce qui aura pour effet de surligner la ligne en rouge.
 
Ensuite tu vérifies que tu compiles bien en debug et pas en release, et ensuite tu lances ton programme en sélectionnant le menu Debug > Start Debugging (j'ai pas de VS en français)
 
Normalement quand tu passeras dans les fonctions VS viendra au 1er plan et t'indiquera sur quelle ligne tu te trouves actuellement.


---------------
Another .Net Blog
n°1863053
ov3rflow
Overrage
Posté le 18-03-2009 à 13:36:27  profilanswer
 

Sinon à la main dans le constructeur:
 
textBox1.KeyDown += new EventHandler(textBox1_KeyDown);
 
Et il faut que tu saches debuuguer une application en effet, c'est vital :D

Message cité 1 fois
Message édité par ov3rflow le 18-03-2009 à 13:37:24
n°1863120
haazheel
Posté le 18-03-2009 à 15:02:44  profilanswer
 

ov3rflow a écrit :

Sinon à la main dans le constructeur:
 
textBox1.KeyDown += new EventHandler(textBox1_KeyDown);


Pas besoin de se faire chier avec ça, l'EDI le fait tout seul quand on affecte un évènement


---------------
Another .Net Blog
n°1863287
ov3rflow
Overrage
Posté le 18-03-2009 à 18:20:33  profilanswer
 

:jap:
 
Ca va super vite aussi quand on le tape , la touche tab est ton amie :D
 
Moi j'aime pas trop passer par l'éditeur pour ça, mais c'est surement des habitudes de vieux :D, ça évite de switcher entre l'éditeur et le code quand on fait des tests.


Message édité par ov3rflow le 18-03-2009 à 18:21:27
n°1863315
chiqitos
Posté le 18-03-2009 à 20:14:19  profilanswer
 

:) Quand je dis que je débutais en C#, je débutes vraiment, je ne connaissais pas le système d'événements (l'éclair dans les propriétés)... Donc maintenant ça marche , merci beaucoup à vous


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Actions selon la durée de pression d'une touche

 

Sujets relatifs
JSF : pb action sur un inputText avec la touche "entrée"[VBA] : action sur la touche ENTER
Access - Suivi d'actions commerciales[VBS] Comment simuler l'appui de la touche tab, windows et enter?
courbes avec en ordonnée axe Y une durée tempsConvertir un long en durée
Fonction reconnaissance touche ?[X11] Gestion de la touche CONTROL dans les menus [Résolu].
Plus de sujets relatifs à : Actions selon la durée de pression d'une touche


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR