NOTES :
Ces deux fonctions sont utilisables pour les applications en mode console.
KeyPressed permet de savoir si une touche est appuyée, sans la lire et sans bloquer l'application.
ReadKey permet de lire une touche du clavier, si aucune touche est en attente, alors ReadKey attend la prochaine touche appuyée.
Pour ne pas bloquer l'application il faut appeler ReadKey seulement si KeyPressed est à True.
CODE :
// 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; WhileNot 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) AndNot 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;