Les flèches Haut, Bas, Gauche et droite ne déclenchent pas L'événement KeyDown

je construis une application où toutes les entrées de clés doivent être gérées par les fenêtres elles-mêmes.

j'ai mis tabstop à false pour chaque sorcière de contrôle pourrait saisir la mise au point sauf un panneau (mais je ne sais pas si elle a un effet).

j'ai mis la valeur true de KeyPreview et je gère L'événement de KeyDown sur ce formulaire.

mon problème est que parfois la touche Flèche ne répondent plus:

  • l'événement keydown n'est pas déclenché lorsque j'ai appuyé seulement sur une touche Flèche.

  • l'événement keydown est déclenché si j'appuie sur une touche Flèche avec le modificateur de contrôle.

avez-vous une idée de la raison pour laquelle ma touche fléchée a soudainement cessé de tirer?

61
demandé sur Roman Starkov 2009-10-30 01:36:47

9 réponses

    protected override bool IsInputKey(Keys keyData)
    {
        switch (keyData)
        {
            case Keys.Right:
            case Keys.Left:
            case Keys.Up:
            case Keys.Down:
                return true;
            case Keys.Shift | Keys.Right:
            case Keys.Shift | Keys.Left:
            case Keys.Shift | Keys.Up:
            case Keys.Shift | Keys.Down:
                return true;
        }
        return base.IsInputKey(keyData);
    }
    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        switch (e.KeyCode)
        {
            case Keys.Left:
            case Keys.Right:
            case Keys.Up:
            case Keys.Down:
                if (e.Shift)
                {

                }
                else
                {
                }
                break;                
        }
    }
54
répondu alpha 2015-09-14 20:05:24

j'avais exactement le même problème. J'ai considéré la réponse @Snarfblam fournie; cependant, si vous lisez la documentation sur MSDN, la méthode ProcessCMDKey est destinée à outrepasser les événements clés pour les éléments de menu dans une application.

je suis tombé récemment sur cet article de microsoft, qui semble très prometteur: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown.aspx . Selon microsoft, le meilleur la chose à faire est de définir e.IsInputKey=true; dans l'événement PreviewKeyDown après avoir détecté les touches fléchées. Cela déclenchera l'événement KeyDown .

cela a très bien fonctionné pour moi et a été moins hack-ish que d'écraser le ProcessCMDKey.

49
répondu Rodolfo Neuber 2014-09-23 22:26:29

j'utilise PreviewKeyDown

    private void _calendar_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e){
        switch (e.KeyCode){
            case Keys.Down:
            case Keys.Right:
                //action
                break;
            case Keys.Up:
            case Keys.Left:
                //action
                break;
        }
    }
15
répondu Marcel 2013-01-24 11:32:17

Voir Rodolfo Neuber de la réponse de pour la meilleure réponse


(ma réponse originale):

dérivent d'une classe de contrôle et vous pouvez outrepasser la méthode ProcessCmdKey. Microsoft a choisi d'omettre ces clés des évènements KeyDown parce qu'elles affectent plusieurs contrôles et déplacent la mise au point, mais cela rend très difficile de faire réagir une application à ces clés d'une autre manière.

15
répondu snarf 2018-03-07 01:06:17

malheureusement, il est assez difficile d'accomplir cela avec les touches fléchées, en raison des restrictions dans les événements KeyDown. Cependant, il y a quelques façons de contourner cela:

  • comme @Snarfblam l'a déclaré, Vous pouvez outrepasser la méthode ProcessCmdKey , qui conserve la capacité de parser les presses à touches fléchées.
  • comme la réponse acceptée de cette question indique, XNA a une méthode intégrée appelé clavier.GetState () , qui vous permet d'utiliser des entrées de touches fléchées. Cependant, WinForms n'a pas cela, mais il peut être fait à travers un p/invoquer , ou par en utilisant une classe qui aide avec elle .

je recommande d'essayer d'utiliser cette classe. C'est assez simple de le faire:

var left = KeyboardInfo.GetKeyState(Keys.Left);
var right = KeyboardInfo.GetKeyState(Keys.Right);
var up = KeyboardInfo.GetKeyState(Keys.Up);
var down = KeyboardInfo.GetKeyState(Keys.Down);

if (left.IsPressed)
{
//do something...
}

//etc...

Si vous l'utilisez en combinaison avec l'événement KeyDown, je pensez que vous pouvez accomplir votre but de façon fiable.

2
répondu Maxim Zaslavsky 2017-05-23 12:18:22

j'ai eu un problème similaire lorsque j'ai appelé la fenêtre WPF de WinForms.

var wpfwindow = new ScreenBoardWPF.IzbiraProjekti();
    ElementHost.EnableModelessKeyboardInterop(wpfwindow);
    wpfwindow.Show();

Cependant, en montrant la fenêtre comme un dialogue , il a fonctionné

var wpfwindow = new ScreenBoardWPF.IzbiraProjekti();
    ElementHost.EnableModelessKeyboardInterop(wpfwindow);
    wpfwindow.ShowDialog();

Espérons que cette aide.

2
répondu Janez Krnc 2016-10-10 21:17:54

pour capturer les touches dans un contrôle de formes, vous devez dériver une nouvelle classe qui est basée sur la classe du contrôle que vous voulez, et vous surchargez le ProcessCmdKey().

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    //handle your keys here
}

exemple:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    //capture up arrow key
    if (keyData == Keys.Up )
    {
        MessageBox.Show("You pressed Up arrow key");
        return true;
    }

    return base.ProcessCmdKey(ref msg, keyData);
}

source complète... flèches dans C#

Vayne

0
répondu vaynenick 2014-06-19 08:00:24

la meilleure façon de faire, je pense, est de le gérer comme le MSDN a dit sur http://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown.aspx

mais manipulez-le, comme vous en avez vraiment besoin. Mon chemin (dans l'exemple ci-dessous) est d'attraper tous les KeyDown ;-)

    /// <summary>
    /// onPreviewKeyDown
    /// </summary>
    /// <param name="e"></param>
    protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)
    {
        e.IsInputKey = true;
    }

    /// <summary>
    /// onKeyDown
    /// </summary>
    /// <param name="e"></param>
    protected override void OnKeyDown(KeyEventArgs e)
    {
        Input.SetFlag(e.KeyCode);
        e.Handled = true;
    }

    /// <summary>
    /// onKeyUp
    /// </summary>
    /// <param name="e"></param>
    protected override void OnKeyUp(KeyEventArgs e)
    {
        Input.RemoveFlag(e.KeyCode);
        e.Handled = true;
    }
0
répondu Marcus Dock 2014-12-20 14:11:57

j'ai eu le même problème et j'utilisais déjà le code dans la réponse choisie. ce lien a été la réponse pour moi; peut-être pour d'autres aussi.

comment désactiver la navigation sur WinForm avec les flèches en C#?

0
répondu 4mla1fn 2017-05-23 11:47:22