Keypressed et readkey dans une application console

Soyez le premier à donner votre avis sur cette source.

Vue 13 677 fois - Téléchargée 483 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

Messages postés
1
Date d'inscription
mercredi 4 novembre 2009
Statut
Membre
Dernière intervention
4 novembre 2009

Bonjour j'utilise Delphi 6 personnel et Xp et de mon côté la fonction ne marche pas non plus! La boucle tourne sans cesse ...
Vous avez une idée ?
Merciiiii
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
14
Avec Delphi 3, il y a plusieurs incompatibilités. Toutes les variables "EnAttente" doivent être du type integer, et Zone[~].Event.KeyEvent se résume simplement avec "Zone[~].KeyEvent".

Ceci dit, ça à l'air de bien marcher avec la combinaison "D3 + Win98SE".
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
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
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
Afficher les 7 commentaires

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.