Keypressed et readkey dans une application console

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

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.