Lecture d'une touche du clavier [Résolu]

holy_artefact 7 Messages postés jeudi 5 octobre 2006Date d'inscription 21 février 2007 Dernière intervention - 21 févr. 2007 à 05:06 - Dernière réponse : Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention
- 21 févr. 2007 à 18:04
Bonjour,

J'ai un petit problème,
J'ai besoin d'obtenir l'état d'une touche du clavier (comme par exemple Q) a un moment précis sans utiliser d'événement comme KeyDown, KeyPress, etc... Y'aurait-t-il une classe dans .NET qui me permetterait de vérifier cette touche ou je vais devoir aller dans le Win API? Et surtout commet s'y prendre?

Merci d'avance
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 21 févr. 2007 à 05:49
3
Merci
Salut, oui via l'API Win32 avec la fonction GetKeyState ou GetKeyboardState..


 




[ DllImport( "user32.dll" ) ]
//[ System.Security.SuppressUnmanagedCodeSecurity ]
private static extern short GetKeyState( int vk );


[ DllImport( "user32.dll", SetLastError = true ) ]
//[ System.Security.SuppressUnmanagedCodeSecurity ]
private static extern bool GetKeyboardState( IntPtr state );


private unsafe void GetKeys( )
{
    byte* pState = stackalloc byte[ 256 ]; // ou un GCHandle pinned.
               
    if ( !GetKeyboardState( ( IntPtr )pState ) )
    {
        throw new System.ComponentModel.Win32Exception( );
    }


    if ( ( pState[ ( int )Keys.R ] & 0x80 ) == 0x80 )
        this.BackColor = Color.Red;


    if ( ( pState[ ( int )Keys.G ] & 0x80 ) == 0x80 )
        this.BackColor = Color.Lime;


    // GetKeyState.
    if ( ( GetKeyState( ( int )Keys.B ) & 0x8000 ) == 0x8000 )
        this.BackColor = Color.Blue;
}

Merci Lutinore 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de Lutinore
holy_artefact 7 Messages postés jeudi 5 octobre 2006Date d'inscription 21 février 2007 Dernière intervention - 21 févr. 2007 à 17:38
0
Merci
Merci, ça marche a merveille, mais c'était la première fois que je faisait du code unsafe, alors j'ai du trouver le :
using System.Runtime.InteropServices;
Mais a part ça tout marche!

Encore merci
Commenter la réponse de holy_artefact
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 21 févr. 2007 à 18:04
0
Merci
Ah oui j'l ai encore oublié au copié/collé ce using.. mais en fait il n'a pas de rapport avec le code unsafe, il est utile pour l'attribut DllImport en fait. En plus là le code unsafe c'est juste pour le plaisir d'utiliser l'expression stackalloc mais y'avait moyen d'allouer un buffer managé et se passer du code unsafe.
Commenter la réponse de Lutinore

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.