Keypressed et readkey dans une application console

0/5 (7 avis)

Vue 14 690 fois - Téléchargée 509 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
28 déc. 2003 à 21:40
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 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
2 janv. 2004 à 15:02
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
30 mars 2004 à 11:51
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
7 avril 2004 à 09:45
ç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
7 avril 2004 à 09:56
ç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.