Keypressed et readkey dans une application console

Soyez le premier à donner votre avis sur cette source.

Vue 13 399 fois - Téléchargée 467 fois

Description

C'est toujours en réponse au forum...

Voici deux fonctions qui permettent de savoir si une touche à été appuyée et une autre qui permet de lire cette touche. Ces fonctions ressemblent un peu à celles du Turbo Pascal : elles sont identiques pour les codes ascii mais pas pour les touches étendues comme F1 F2...

Source / Exemple :


// Fonction donnant TRUE si une touche est en attente
// elle ne prend en compte que les touches donnant un caractère, donc
// elle ne fonctionne pas avec les touches de fonctions
Function KeyPressed:Boolean;
Const TailleBuf =20;
Var   Zone      :Array[1..TailleBuf] Of TInputRecord;
      EnAttente :Cardinal;
      i         :Cardinal;
Begin
  // Demande de la liste des évènements en attente
  PeekConsoleInput(STD_INPUT_HANDLE,Zone[1],TailleBuf,EnAttente);
  Result:=False;
  i:=1;
  While Not Result And (i<=EnAttente) And( i<=TailleBuf ) Do
  Begin
    Result:=   (Zone[i].EventType=1)                   // C'est un évènement clavier
           And (Zone[i].Event.KeyEvent.bKeyDown)       // C'est une touche appuyée
           And (Zone[i].Event.KeyEvent.AsciiChar<>#0); // ce n'est pas une touche de controle
    Inc(i);
  End;
  // Si il n'y a pas de touche, le buffer est vidé car windows
  // à une limite très basse d'évènements en attente
  If (EnAttente<>0) And Not Result Then ReadConsoleInput(STD_INPUT_HANDLE,Zone[1],EnAttente,i);
End;

// Fonction qui retourne lit un caractère émit par le clavier.
// si aucun caractère n'est en attente, cette fonction est bloquante
// et attend qu'un caractère soit saisi.
Function ReadKey:Char;
Var Zone : TInputRecord;
    Lus  : Cardinal;
Begin
  Result:=#0;
  Repeat
    // Lecture du buffer des évènement
    ReadConsoleInput(STD_INPUT_HANDLE,Zone,1,Lus);
    If (Lus=1)                                   // Un évènement est lu
       And (Zone.EventType=1)                    // C'est un évènement clavier
       And (Zone.Event.KeyEvent.bKeyDown)        // C'est un appui
       And (Zone.Event.KeyEvent.AsciiChar<>#0)   // C'est bien un caractère
    Then Result:=Zone.Event.KeyEvent.AsciiChar;  // => mémorisation du code
  Until Result<>#0;
End;

Conclusion :


Si vous avez besoin de lire aussi les touches étendue, faites-moi signe. Je ferais alors une version améliorée de ce code.

Et mes remerciements à DelphiProg qui m'a mis sur la voie...

-------------------
Cette source et quelques autres sur : http://nono40.developpez.com

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

linabar
Messages postés
2
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
28 décembre 2003
-
Bonjour
Le fichier tel que ne fonctionne pas avec Delphi 6 personnel et Windows XP. Le programme attend indéfiniment et n'a pas l'air de détecter une frappe au clavier.
Est ce normal ?
Merci
cs_Nono40
Messages postés
1000
Date d'inscription
mercredi 3 avril 2002
Statut
Membre
Dernière intervention
12 septembre 2006
1 -
Bonjour, c'est surprennant car j'ai fait des tests sous XP et ça fonctionne bien ( avec Delphi 6 aussi ). Comment utilises-tu la fonction ?
facosh
Messages postés
8
Date d'inscription
dimanche 8 février 2004
Statut
Membre
Dernière intervention
8 avril 2004
-
Oui c'est bien joli tout sa, mais moi j'aimerai bloquer les touches windows, et la touche Alt, et la touche Controle, car je veux réaliser une appli bloquant totalement l'acces à Windows XP. Alors si tu as des idées je suis preneur
cs_nessi
Messages postés
24
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
9 décembre 2003
-
ça marche pas vraiment non plus pour moi.
il détecte pas quand j'appuie sur une touche : En attente est toujours à zero.

pour info: Delphi 6 avec Windows 2000
cs_nessi
Messages postés
24
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
9 décembre 2003
-
ça marche pas vraiment non plus pour moi.
il détecte pas quand j'appuie sur une touche : En attente est toujours à zero.

pour info: Delphi 6 avec Windows 2000

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.