131 votes

Comment détecter la touche actuellement enfoncée ?

Dans WinForms, vous pouvez connaître, à tout moment, la position actuelle du curseur grâce à la classe Cursor.

La même chose ne semble pas être disponible pour le clavier. Est-il possible de savoir si, par exemple, la touche Shift est enfoncée ?

Est-il absolument nécessaire de suivre chaque notification du clavier (événements KeyDown et KeyUp) ?

169voto

SLaks Points 391154
if ((Control.ModifierKeys & Keys.Shift) != 0) 

Ce sera également le cas si Ctrl + Shift est enfoncée. Si vous voulez vérifier si la touche Shift seule est enfoncée,

if (Control.ModifierKeys == Keys.Shift)

Si vous êtes dans une classe qui hérite de Control (par exemple un formulaire), vous pouvez supprimer l'option Control.

57voto

Ash Points 31541

C'est un peu tard, mais le code ci-dessous permet de détecter presque toutes les touches actuellement pressées, et pas seulement la touche Shift.

J'ai remarqué que la plupart des autres réponses ne répondent pas vraiment à la question.

private KeyMessageFilter m_filter = new KeyMessageFilter();

private void Form1_Load(object sender, EventArgs e)
{
    Application.AddMessageFilter(m_filter);

}

public class KeyMessageFilter : IMessageFilter
{
    private Dictionary<Keys, bool> m_keyTable = new Dictionary<Keys, bool>();

    public Dictionary<Keys, bool> KeyTable
    {
        get { return m_keyTable; }
        private set { m_keyTable = value; }
    }

    public bool IsKeyPressed()
    {
        return m_keyPressed; 
    }

    public bool IsKeyPressed(Keys k)
    {
        bool pressed = false;

        if (KeyTable.TryGetValue(k, out pressed))
        {
            return pressed;                  
        }

        return false; 
    }

    private const int WM_KEYDOWN = 0x0100;

    private const int WM_KEYUP = 0x0101;

    private bool m_keyPressed = false;

    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == WM_KEYDOWN)
        {
            KeyTable[(Keys)m.WParam] = true;

            m_keyPressed = true;
        }

        if (m.Msg == WM_KEYUP)
        {                
            KeyTable[(Keys)m.WParam] = false;

            m_keyPressed = false;
        }

        return false;
    }
}

24voto

Jeff Wain Points 774

Vous pouvez aussi regarder ce qui suit si vous faites référence à System.Windows.Input

if (Keyboard.Modifiers == ModifierKeys.Shift)

L'espace de noms Keyboard peut également être utilisé pour vérifier l'état de pression d'autres touches avec Keyboard.IsKeyDown(Key), ou si vous vous abonnez à un KeyDownEvent ou à un événement similaire, les arguments de l'événement contiennent une liste des touches actuellement pressées.

20voto

parsley72 Points 804

La plupart de ces réponses sont soit beaucoup trop compliquées, soit ne semblent pas fonctionner pour moi (par exemple, System.Windows.Input ne semble pas exister). J'ai ensuite trouvé un exemple de code qui fonctionne bien : http://www.switchonthecode.com/tutorials/winforms-accessing-mouse-and-keyboard-state

Au cas où la page disparaîtrait à l'avenir, je publie le code source correspondant ci-dessous :

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace MouseKeyboardStateTest
{
  public abstract class Keyboard
  {
    [Flags]
    private enum KeyStates
    {
      None = 0,
      Down = 1,
      Toggled = 2
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    private static extern short GetKeyState(int keyCode);

    private static KeyStates GetKeyState(Keys key)
    {
      KeyStates state = KeyStates.None;

      short retVal = GetKeyState((int)key);

      //If the high-order bit is 1, the key is down
      //otherwise, it is up.
      if ((retVal & 0x8000) == 0x8000)
        state |= KeyStates.Down;

      //If the low-order bit is 1, the key is toggled.
      if ((retVal & 1) == 1)
        state |= KeyStates.Toggled;

      return state;
    }

    public static bool IsKeyDown(Keys key)
    { 
      return KeyStates.Down == (GetKeyState(key) & KeyStates.Down);
    }

    public static bool IsKeyToggled(Keys key)
    { 
      return KeyStates.Toggled == (GetKeyState(key) & KeyStates.Toggled);
    }
  }
}

14voto

Steven Doggart Points 22763

Depuis la version 3.0 de .NET Framework, il est possible d'utiliser la fonction Keyboard.IsKeyDown de la nouvelle System.Windows.Input dans la bibliothèque PresentationCore.dll. Par exemple :

if (((Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) && Keyboard.IsKeyDown(Key.F))
{
    // CTRL + F is currently pressed
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X