cs_alncool
Messages postés16Date d'inscriptionjeudi 4 décembre 2003StatutMembreDernière intervention12 juillet 2005
-
8 févr. 2005 à 09:13
ronan -
2 mars 2019 à 11:54
Voila j'ai une application à réaliser qui utilise les différents appuis sur des touches définies du clavier pour executer différents traitements. Dans mes recherches j'ai trouvé que je devais utiliser les classes System.Windows.Forms.KeyPressEventHandler ou Windows.Forms.KeyEventHandler pour intercepter les messages. J'ai compris aussi qu'il y avait trois types de message KeyDown (pour le message dès l'appuis de la touche), KeyUp (pour le message quand la touche est relachée) et KeyPress (quand la touche reste appuyée).
[corrigez moi si je me trompe!]
Cependant je n'ai pas trouvé d'exemple concret sur l'utilisation 'un peu avancé' des touche comme la détection d'un appuis long, la double pression sur une touche (comme un double clic). En fait j'ai souvent trouvé des interception dans le genre :
Donc j'aimerai bien savoir si quelqu'un a déjà utilisé ces méthodes pour m'éclairer un peu car cet exemple est trop limité pour mon application. En fait mon projet tourne autour d'un Pocket PC dont l'utilisation ne s'effectue que par gestion clavier. Je programme sous Visual .Net 2003 avec, bien entendu, le SDK pour pocket PC.
Je vous serai très reconnaissant pour votre aide!
Merci d'avance
Règle du bon codeur:
1) faire compliquer quand on peut faire simple
2) taper sur son PC quand ça ne marche pas
3) profiter de ses erreurs pour les recopiers dans un autre programme
4) je crois qu'avec tout ça j'y arriverai un jour
cs_alncool
Messages postés16Date d'inscriptionjeudi 4 décembre 2003StatutMembreDernière intervention12 juillet 2005 9 févr. 2005 à 15:37
Le fait que ce soit le Pocket Pc n'influe en rien le code.. le joytick et les bouttons sont considéré comme un clavier ordinaire.
En fait le code que tu ma écris est aussi un autre style de code que j'ai beaucoup trouvé cependant je reste sur le même probleme : comment je fais pour gérer des appuis long sur une touche ou des doubles appuis?
En gros j'aimerai savoir si il existe une classe avec des méthode pour gérer les appuis long, court et aussi double appuis.
Je suis preneur de nimporte quel source et même en VC++ 6, ou VB.NET ou encore VC.NET.
Merci cependant de ta réponse qui a été tres rapide! ;)
Règle du bon codeur:
1) faire compliquer quand on peut faire simple
2) taper sur son PC quand ça ne marche pas
3) profiter de ses erreurs pour les recopiers dans un autre programme
4) je crois qu'avec tout ça j'arriverai un jour
cs_alncool
Messages postés16Date d'inscriptionjeudi 4 décembre 2003StatutMembreDernière intervention12 juillet 2005 5 mai 2005 à 12:34
Voila étant moi même
l'auteur de ce topic je tiens à mettre à disposition la solution de mon
problème. Je suis sûr que ca aidera pas mal un grnad nombre d'entre
vous qui ont besoin de gérer le clavier. Mon code n'est peut-être pas
très optimisé mais sa peut dépanner. ;)
Voici le code que j'ai réalisé avec l'environnement Visual Studio 2003 plus le SDK Pocket PC 2003
Fichier Form1.cs // en C#
using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Data;
namespace gestionPad
{
///
/// Description résumée de Form1.
///
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.MainMenu mainMenu1;
private System.Windows.Forms.Timer timer1;
private System.Windows.Forms.Timer timer2;
private System.Windows.Forms.ListBox listBox2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
// Définition des variables
private bool isDoublePressed;
private int indexListBoxTouche;
private int indexListBoxType;
private bool isPressed;
public Form1()
{
//
// Requis pour la prise en charge du Concepteur Windows Forms
//
InitializeComponent();
//
// TODO : ajoutez le code du
constructeur après l'appel à InitializeComponent
//
}
///
/// Nettoyage des ressources utilisées.
///
protected override void Dispose( bool disposing )
{
base.Dispose( disposing );
}
#region Code généré par le Concepteur Windows Form
///
/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
/// le contenu de cette méthode avec l'éditeur de code.
///
private void InitializeComponent()
{
this.mainMenu1 = new System.Windows.Forms.MainMenu();
this.listBox1 = new System.Windows.Forms.ListBox();
this.timer1 = new System.Windows.Forms.Timer();
this.timer2 = new System.Windows.Forms.Timer();
this.listBox2 = new System.Windows.Forms.ListBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
//
// listBox1
//
this.listBox1.Location = new System.Drawing.Point(8, 40);
this.listBox1.Size = new System.Drawing.Size(224, 80);
//
// timer1
//
this.timer1.Interval = 500;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
//
// timer2
//
this.timer2.Interval = 300;
this.timer2.Tick += new System.EventHandler(this.timer2_Tick);
//
// listBox2
//
this.listBox2.Location = new System.Drawing.Point(8, 160);
this.listBox2.Size = new System.Drawing.Size(224, 80);
//
// label1
//
this.label1.Location = new System.Drawing.Point(8, 8);
this.label1.Size = new System.Drawing.Size(224, 20);
this.label1.Text = "Touche détectée :";
//
// label2
//
this.label2.Location = new System.Drawing.Point(8, 128);
this.label2.Size = new System.Drawing.Size(224, 20);
this.label2.Text = "Type d\'appuis détecté :";
//
// Form1
//
this.ClientSize = new System.Drawing.Size(240, 254);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.listBox2);
this.Controls.Add(this.listBox1);
this.Menu = this.mainMenu1;
this.Text = "Gestion du Pad";
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.appuis);
this.KeyUp += new
System.Windows.Forms.KeyEventHandler(this.relachement);
Donc pour ne pas vous
embrouiller avec tout mon code superflux pour mettre à jour les
affichage dans les listbox etc je vous donne mon algorithme simplifié
au max :
Evénement on détecte un message de relâchement de touche
Aucune touche pressée
Fin Evénement
Evénement on détecte un message de pression de touche
Si aucune touche n’est appuyée alors
Une touche est enfoncée
Si le Timer1 n’ est pas lancé
Lancement du timer1 // qui s’arrête au bout de 500ms
Sinon
Détection d’un double appuis
Fin Si
Fin Si
Fin Evénement
Evénement Timer1 arrêté
Si l’on a pas détecté un double appuis
On lance le Timer2 // qui s’arrête au bout de 300ms
Sinon
On ne détecte plus de double appuis
Fin Si
Fin Evénement
Evénement Timer2 arrêté
Si on a encore une touche pressée
Détection d’un appui long
Sinon
Détection d’un appuis court
Fin Si
Fin Evénement
Explication supplémentaires :
En gros la détection se base sur une échelle de temps dont la réaction
du programme s'effectue au maximum à 800ms pour ce qui est de la
détection des appuis court et long et d'un peut moins pour ce qui est
du double appuis (dépend de la vitesse de l'utilisateur).
Le programme détecte un appuis court si l'appui dure moins de 800ms, un
appui long si l'appui dure plus de 800ms et double appuis si l'on
appuie deux fois une touche en moins de 500ms d'intervalle.
Vous vous demanderez peut être pourquoi a chaque touche du pad
directionnel j'ai deux 'case', eh bien tout simplement parce que chez
moi l'émulateur utilise les valeur des touches du pavé numérique alors
qu'un vrai pocket pc utilise la valeur des touche directionnelle
(située entre les touches alphanumériques et numériques). Alors une
bonne lesson : ne vous fiez pas à ce que vous dit l'emulateur car des
fois on est loin de la réalité ... testez aussi sur le vrai pocket. Je
suis resté deux semaines sur un probleme de projet à l'école à cause de ça!!
Voila..Si vous avez des remarques ou simplement me remercier parce sa vous a aider :p ...
Règle du bon codeur:
1) faire compliquer quand on peut faire simple
2) taper sur son PC quand ça ne marche pas
3) profiter de ses erreurs pour les recopiers dans un autre programme
4) je crois qu'avec tout ça j'arriverai un jour