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
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.