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

Signaler
Messages postés
7
Date d'inscription
jeudi 5 octobre 2006
Statut
Membre
Dernière intervention
21 février 2007
-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
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

3 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
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;
}
Messages postés
7
Date d'inscription
jeudi 5 octobre 2006
Statut
Membre
Dernière intervention
21 février 2007

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
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
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.