Test touche du clavier

Gilprod Messages postés 7 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 23 février 2008 - 22 févr. 2008 à 15:39
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 23 févr. 2008 à 22:56
Salut à tous,

Je suis débutant, merci de votre indulgence.

J'ai un problème avec la fonction :
Keyboard.IsKeyDown(Key.Escape)
Celle ci me retourne toujours FALSE (quel que soit la touche testée).

Merci de votre aide.
Gilles

12 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
23 févr. 2008 à 01:08
Salut,

Si tu développes une application WPF et que la touche est pressée au moment du test il n'y a pas de raison que ça ne marche pas.
Par contre dans une application WinForm je doute que ça fonctionne, tu devras sans doute passer directement par les API Win32 qui vont bien (GetKeyState etc)

/*
coq
MVP Visual C#
CoqBlog
*/
0
Gilprod Messages postés 7 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 23 février 2008
23 févr. 2008 à 17:24
Merci pour ta réponse.
Concernant System.Windows.Input.Keyboard.IsKeyDown(Key key), cela ne marche qu’avec Vista et je suis sous XP. (voir site Crosoft).

J’ai essayé avec l’API user32.dll, GetKeyState.
Ça marche tant que la Form à le focus, mais dés que je clique sur mon bouton, GetKeyState me retourne toujours la même valeur. Et là, je ne pige pas pourquoi ?[Merci pour ta réponse.
]
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
23 févr. 2008 à 18:40
Ca marche sous XP du moment qu'on se trouve dans une appli WPF et pas WinForm (après je ne sais pas si ça marche sous Vista dans une appli WinForm, à voir). La doc induit en erreur là.

Comment utilises tu GetKeyState ?

/*
coq
MVP Visual C#
CoqBlog
*/
0
Gilprod Messages postés 7 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 23 février 2008
23 févr. 2008 à 18:55
J'ai ajouté ce code dans ma class FormName:
[DllImport("user32")]
private static extern short GetKeyState(int vKey);

Dans le code qui s'exécute lorsque je clique sur mon bouton, GetKeyState me retourne toujours la même valeur (c'est à fire l'état de ma touche avant que je clique sur le bouton).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
23 févr. 2008 à 19:18
Oula attend, faisont un point :
1) où utilises tu ceci ?
2) quel est le code utilisant GetKeyState ?

/*
coq
MVP Visual C#
CoqBlog
*/
0
Gilprod Messages postés 7 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 23 février 2008
23 févr. 2008 à 19:41
Extrait de mon code :

public class FormName : System.Windows.Forms.Form
{
[DllImport("user32")]
private static extern short GetKeyState(int vKey);

... etc

// gestion du clic sur le bouton
private void button2_Click(object sender, EventArgs e)
{
code divers...

// test si Escape est pressé
int escapeState = Convert.ToInt16(Keys.Escape);
if (escapeState -127 || escapeState -128)
{
richTextBox1.Clear();
richTextBox1.AppendText("Search canceleled\n");
return;
}
}
}
0
Gilprod Messages postés 7 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 23 février 2008
23 févr. 2008 à 19:47
Oops remplacer:
int escapeState = Convert.ToInt16(Keys.Escape);

par :
int escapeState = GetKeyState(Convert.ToInt16(Keys.Escape));
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
23 févr. 2008 à 20:32
J'aurais plutot fait quelquechose de ce genre :

[DllImport("user32.dll")]
private static extern Int16 GetKeyState(int nVirtKey);


private const Int32 VK_ESCAPE = 0x1B;


private Boolean IsEscapeDown()
{
    Int16 keyState = GetKeyState(VK_ESCAPE);
    return ((keyState & 0x8000) == 0x8000);
}

Mis à part ça, je ne comprend pas ce que tu voulais dire par "Dans le code qui s’exécute lorsque je clique sur mon bouton, GetKeyState me retourne toujours la même valeur (c’est à fire l’état de ma touche avant que je clique sur le bouton).".

/*
coq
MVP Visual C#
CoqBlog
*/
0
Gilprod Messages postés 7 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 23 février 2008
23 févr. 2008 à 22:01
Merci, c'est en effet beaucoup plus élégant comme code.

Mais j'ai toujours le même problème...

Pour être plus explicite :
Lorsque je clique sur mon bouton, le programme recherche des fichiers (opération qui peut prendre un certain temps, c'est pour cela que je veux que l'utilisateur puisse annuler cette recherche).
Si j'appuie sur Escape (et que je maintiens la touche appuyée) et que je clique sur mon bouton, ta fonction me retourne bien TRUE et la recherche est bien annulée.
Si je clique d'abord sur mon bouton, j'ai beau appuyer sur Escape, la fonction me retourne toujours FALSE.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
23 févr. 2008 à 22:24
Ha oui mais non, GetKeyState ne peut fonctionner dans ce cas.
Quand tu cliques sur ton bouton, tu lances ton traitement dans le thread courant, qui est celui du GUI.
Du coup les messages Windows ne sont plus traités, d'où le freeze du GUI.
Hors comme l'indique la doc, le retour de GetKeyState est basé sur le traitement des messages : "The key status returned from this function changes as a thread reads key messages from its message queue. The status does not reflect the interrupt-level state associated with the hardware. Use the GetAsyncKeyState function to retrieve that information."
En clair : quand tu fais tes appels, l'application ne sais pas que la touche a été pressée, le message WM_KEYDOWN n'a pas été traité et se trouve toujours dans la file de messages.
Donc soit tu utilises GetAsyncKeyState, soit tu demandes le traitement des messages dans la boucle (Application.DoEvents()...), soit tu t'intéresses à la programmation en utilisant des threads (Thread, BackgroundWorker etc etc) pour développer tes fonctionnalités de recherche "proprement".

/*
coq
MVP Visual C#
CoqBlog
*/
0
Gilprod Messages postés 7 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 23 février 2008
23 févr. 2008 à 22:45
Super, ça semble marcher avec GetAsyncKeyState !!!

Merci infiniment pour ton aide et ta patience. :)))
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
23 févr. 2008 à 22:56
De rien :-)

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous