WPF détecter si touche Maj activée [Résolu]

Signaler
Messages postés
13
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
2 octobre 2009
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
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

Messages postés
15
Date d'inscription
jeudi 19 janvier 2006
Statut
Membre
Dernière intervention
26 août 2009

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());
Messages postés
15
Date d'inscription
jeudi 19 janvier 2006
Statut
Membre
Dernière intervention
26 août 2009

Messages postés
15
Date d'inscription
jeudi 19 janvier 2006
Statut
Membre
Dernière intervention
26 août 2009

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);

Messages postés
13
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
2 octobre 2009

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


Dans mon fichier Windows.xaml je le mets où?
Messages postés
13
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
2 octobre 2009

pardon Windows.xaml.cs
Messages postés
15
Date d'inscription
jeudi 19 janvier 2006
Statut
Membre
Dernière intervention
26 août 2009

Psa dans le .xaml mais dans le code behind
Messages postés
13
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
2 octobre 2009

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
Messages postés
13
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
2 octobre 2009

OK niquel ton exemple !

Merci beaucoup, tu m'a épargné une nouvelle heure de perdue
Messages postés
15
Date d'inscription
jeudi 19 janvier 2006
Statut
Membre
Dernière intervention
26 août 2009

content que ca t'aide :)
a plus
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
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
*/