Lecture d'une touche du clavier

Résolu
holy_artefact Messages postés 7 Date d'inscription jeudi 5 octobre 2006 Statut Membre Dernière intervention 21 février 2007 - 21 févr. 2007 à 05:06
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 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

3 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
21 févr. 2007 à 05:49
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;
}
3
holy_artefact Messages postés 7 Date d'inscription jeudi 5 octobre 2006 Statut Membre Dernière intervention 21 février 2007
21 févr. 2007 à 17:38
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
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
21 févr. 2007 à 18:04
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.
0
Rejoignez-nous