cs_coq
Messages postés6351Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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)
Gilprod
Messages postés7Date d'inscriptionmercredi 13 février 2008StatutMembreDernière intervention23 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.
]
cs_coq
Messages postés6351Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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à.
Gilprod
Messages postés7Date d'inscriptionmercredi 13 février 2008StatutMembreDernière intervention23 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).
Vous n’avez pas trouvé la réponse que vous recherchez ?
Gilprod
Messages postés7Date d'inscriptionmercredi 13 février 2008StatutMembreDernière intervention23 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;
}
}
}
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).".
Gilprod
Messages postés7Date d'inscriptionmercredi 13 février 2008StatutMembreDernière intervention23 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.
cs_coq
Messages postés6351Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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".