Detecter les touches pressees du clavier

Soyez le premier à donner votre avis sur cette source.

Snippet vu 25 004 fois - Téléchargée 3 271 fois

Contenu du snippet

Ce code permet de savoir si une touche du clavier ou un bouton de la souris est pressé, et renvoi le numéro ASCII de cette touche,...

Source / Exemple :


var
a: integer;
arret:boolean;
begin
  arret:=false;
  while Arret=False do begin

    If (GetAsyncKeyState(27) And 32768) <> 0 Then arret:=true; // Action kan une touche précise est pressée (ici echape : 27)

    For a := 0 To 255 do begin //scan les touches de 0 a 255(en général ca fait tou le clavier)
      If (GetAsyncKeyState(a) And 32768) <> 0 Then begin
        beep; //Action kan une touche est pressée
        //a correspond au numéro ASCII de la touche pressé
        //Button1.caption:=IntToStr(a);
      end;
    end;

      application.ProcessMessages;
  end;

ShowMessage('Fin'); 
end;

A voir également

Ajouter un commentaire

Commentaires

cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
Salut,
pour le nombre magique :
{$EXTERNALSYM KF_UP}
KF_UP = $8000;
0+
Cirec
cs_grandvizir
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
10
«je comprend pas a koi sert 32768 svp»

Un entier est de type INTEGER. Mais souvent il est nécessaire de passer 2 nombres dans la même variable. Pour pouvoir réaliser ceci, il faut ruser. On déclare 3 entiers notés ix, et on définit i3 comme: "i3:=i1 or i2;"

On vient donc de combiner 2 entiers dans le 3ème. Pour savoir si i1 ou i2 sont contenus dans i3, on effectue un autre calcul (pas vraiment la réciproque):
if i3 and i1 = 0 then ShowMessage('i1 est dans i3')
else ShowMessage('i1 n''est pas contenu dans i3');

Dans le code de fabiin, la fonction GetAsyncKeyState renvoie une combinaison de nombres. Il effectue un test AND avec le nombre magique 32768 afin de savoir s'il est contenu dedans. Mais ce nombre vaut en réalité 0. Ho ???

C'est tout à fait normal. GetAsyncKeyState renvoie un SHORTINT comme résultat, mais version C++. C'est pas le même que Delphi (ce serait sinon -32768). En fait, c'est compliqué car SHORTINT(32768)=0 selon Delphi, mais en même temps, il est dit que SHORTINT=-32768..32767. Il y a une incohérence, mais vous devez bien voir le truc. Ici, 32768 dépasse les limites de sous-étendues de SHORTINT (32768>32767). Du coup, on reboucle un tour. Autre exemple: BYTE va de 0..255. Mais le nombre 256 vaut 0 en byte, 257 vaut 1, 258 vaut 2 ...etc. Une boucle !!

Et donc la présence ou non d'un 0 dit si une touche a été pressée ou non. Ou du moins, ça peut donner ce genre d'informations.

Sinon, une remarque: fabiin fait une boucle de 0 à 255 en revérifiant à chaque fois l'état du clavier. Mais il me semble qu'il existe une fonction qui renvoit l'état du clavier à un instant T via un tableau de longueur totale 256. Ensuite, il suffit juste de naviguer dedans. Je ne retrouve plus le nom... ou alors ça n'existe pas.
cs_subzero
Messages postés
71
Date d'inscription
mercredi 8 janvier 2003
Statut
Membre
Dernière intervention
24 février 2012

Exact! En fait, on doit insérer un sleep et un Application.ProcessMessages pour éviter de saturer le cpu. Plus le delai de Sleep sera court, plus le proc sera solicité, à+
cs_gamez
Messages postés
34
Date d'inscription
samedi 14 juin 2003
Statut
Membre
Dernière intervention
27 janvier 2007

quand on appuye sur aucune toucheet quon attends, lutilisation du proc est au maximum à cause de la boucle, non?
cs_subzero
Messages postés
71
Date d'inscription
mercredi 8 janvier 2003
Statut
Membre
Dernière intervention
24 février 2012

Salut à tous, j'ai voulu faire la même chose! Là où j'ai été bloqué, c'est quand j'ai voulu les touches spéciales...
Si ça vous branche, allez voir le sujet "Touches de clavier en simultanné". C'est un clavier virtuel, qui marche avec un hook, c'est à dire qu'il est capable de fonctionner en arrière plan, et capture vraiement toutes les touches. J'ai intégré à l'archive, un programme pour déplacer le curseur de la souris avec les touches... à+

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.