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

cs_mouic 13 Messages postés mardi 27 mars 2007Date d'inscription 2 octobre 2009 Dernière intervention - 26 août 2009 à 14:54 - Dernière réponse : cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention
- 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
Afficher la suite 

10 réponses

Répondre au sujet
spyroo 15 Messages postés jeudi 19 janvier 2006Date d'inscription 26 août 2009 Dernière intervention - 26 août 2009 à 15:07
+3
Utile
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());
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de spyroo
spyroo 15 Messages postés jeudi 19 janvier 2006Date d'inscription 26 août 2009 Dernière intervention - 26 août 2009 à 15:22
+3
Utile
ah :)

Ben je peux te donner cet exemple, essaye de t'en inspirer :)

http://blogs.msdn.com/wpfsdk/archive/2007/08/02/a-wpf-window-without-an-window-icon-the-thing-you-click-to-get-the-system-menu.aspx
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de spyroo
spyroo 15 Messages postés jeudi 19 janvier 2006Date d'inscription 26 août 2009 Dernière intervention - 26 août 2009 à 15:31
+3
Utile
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);

Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de spyroo
cs_mouic 13 Messages postés mardi 27 mars 2007Date d'inscription 2 octobre 2009 Dernière intervention - 26 août 2009 à 15:15
0
Utile
DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]


Dans mon fichier Windows.xaml je le mets où?
Commenter la réponse de cs_mouic
cs_mouic 13 Messages postés mardi 27 mars 2007Date d'inscription 2 octobre 2009 Dernière intervention - 26 août 2009 à 15:16
0
Utile
pardon Windows.xaml.cs
Commenter la réponse de cs_mouic
spyroo 15 Messages postés jeudi 19 janvier 2006Date d'inscription 26 août 2009 Dernière intervention - 26 août 2009 à 15:18
0
Utile
Psa dans le .xaml mais dans le code behind
Commenter la réponse de spyroo
cs_mouic 13 Messages postés mardi 27 mars 2007Date d'inscription 2 octobre 2009 Dernière intervention - 26 août 2009 à 15:27
0
Utile
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
Commenter la réponse de cs_mouic
cs_mouic 13 Messages postés mardi 27 mars 2007Date d'inscription 2 octobre 2009 Dernière intervention - 26 août 2009 à 15:31
0
Utile
OK niquel ton exemple !

Merci beaucoup, tu m'a épargné une nouvelle heure de perdue
Commenter la réponse de cs_mouic
spyroo 15 Messages postés jeudi 19 janvier 2006Date d'inscription 26 août 2009 Dernière intervention - 26 août 2009 à 16:20
0
Utile
content que ca t'aide :)
a plus
Commenter la réponse de spyroo
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 26 août 2009 à 23:26
0
Utile
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
*/
Commenter la réponse de cs_coq

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.