WPF détecter si touche Maj activée

Résolu
cs_mouic Messages postés 13 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 2 octobre 2009 - 26 août 2009 à 14:54
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 26 août 2009 à 23:26
Bonjour ,

je développe actuellement une application sous VS 2008 WPF en CSharp.
Je voudrais détecter si l'utilisateur à la touche Maj activé sur son clavier.

Je pense que c'est largement possible mais je n'ai pour le moment rien trouvé de fonctionnel sur la toile ou sur le MSDN .

Il existe bien un onKeyDownHandler à placer dans un textBox par exemple, mais je veux pouvoir faire cette détection à tout moment et non pas seulement quand l'utilisateur appuie sur une touche du clavier.

Je précise que l'application utilise un lecteur de code barre et que si la touche Maj est activée les caractères ne sont pas valides.

Merci d'avance !

P.S. : désolé si mon message n'apparait pas dans la bonne rubrique je ne savais pas trop où le caler

10 réponses

spyroo Messages postés 15 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 26 août 2009
26 août 2009 à 15:07
il faut passer par l'API windows

DllImport("user32.dll", CharSet CharSet.Auto, ExactSpelling true, CallingConvention = CallingConvention.Winapi)]
public static extern short GetKeyState(int keyCode


Ensuite tu l'utilises:

bool CapsLock = (((ushort)GetKeyState(0x14)) & 0xffff) != 0;
MessageBox.Show("Caps Lock is on: " + CapsLock.ToString());
3
spyroo Messages postés 15 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 26 août 2009
26 août 2009 à 15:22
3
spyroo Messages postés 15 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 26 août 2009
26 août 2009 à 15:31
Oui dans windows.xaml.cs, à l'interieur de ta classe
Regarde le lien de mon dernier message, tu verras les DLLimport

ah oui tiens il manque la fin oO
Je te redonne le bout de code ^^


[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]

public static extern short GetKeyState(int keyCode);

3
cs_mouic Messages postés 13 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 2 octobre 2009
26 août 2009 à 15:15
DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]


Dans mon fichier Windows.xaml je le mets où?
0

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

Posez votre question
cs_mouic Messages postés 13 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 2 octobre 2009
26 août 2009 à 15:16
pardon Windows.xaml.cs
0
spyroo Messages postés 15 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 26 août 2009
26 août 2009 à 15:18
Psa dans le .xaml mais dans le code behind
0
cs_mouic Messages postés 13 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 2 octobre 2009
26 août 2009 à 15:27
ok donc dans le windows.xaml.cs c'est ça? Après les using? Ou dans la définition de ma classe? Ou ailleurs ?

DllImport("user32.dll", CharSet CharSet.Auto, ExactSpelling true, CallingConvention = CallingConvention.Winapi)]

public static extern short GetKeyState(int keyCode


il en manque pas un bout "(int keyCode"... ?

Merci pour ton temps
0
cs_mouic Messages postés 13 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 2 octobre 2009
26 août 2009 à 15:31
OK niquel ton exemple !

Merci beaucoup, tu m'a épargné une nouvelle heure de perdue
0
spyroo Messages postés 15 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 26 août 2009
26 août 2009 à 16:20
content que ca t'aide :)
a plus
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
26 août 2009 à 23:26
Bonjour,

Petite remarque : il serait tout de même mieux de ne pas directement intégré les définitions des appels de plateforme dans les fichiers de code behind, ça n'a rien à y faire.
Il vaudrait mieux placer les définitions en elle même au minimum dans une classe séparée (si on suit la règle de nommage de classe NativeMethods/SafeNativeMethods/UnsafeNativeMethods c'est encore mieux), et aussi les isoler afin que les éléments du GUI ne fassent pas directement appel à ces méthodes.
Les sortir totalement du projet de GUI pour offrir ces services depuis une bibliothèque de classes peut être sympatique aussi.

Dans le cas présent le besoin est de savoir si une touche est activée, le service à rendre est donc une simple réponse oui/non, il ne faut pas que le code du GUI fasse l'appel de GetKeyState et manipule lui même le retour pour en extraire la réponse.
Dans le cas de GetKeyState c'est peut être soft, mais dans d'autre cas on peut assez vite aller à la catastrophe.
Et en fournissant une méthode simple on évite au moins les copier/coller d'un bloc de 3 lignes au profit d'un appel d'une seule, le jour où un autre écran nécessitera la même information.


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