Question

Je suis nouveau sur C# et je travaille sur une application existante.J'ai une fenêtre DirectX qui contient des composants que je souhaite pouvoir positionner à l'aide des touches fléchées.

Actuellement, je remplace ProcessCmdKey, j'attrape la saisie de la flèche et j'envoie un événement OnKeyPress.Cela fonctionne, mais je veux pouvoir utiliser des modificateurs (ALT+CTRL+CHANGEMENT).Dès que je maintiens un modificateur et que j'appuie sur une flèche, aucun événement que j'écoute n'est déclenché.

Quelqu'un a-t-il des idées ou des suggestions sur la direction à suivre ?

Était-ce utile?

La solution

Dans votre ProcessCmdKey remplacé, comment déterminez-vous quelle touche a été enfoncée ?

La valeur de keyData (le deuxième paramètre) changera en fonction de la touche enfoncée et des touches de modification. Ainsi, par exemple, appuyer sur la flèche gauche renverra le code 37, Maj-gauche renverra 65573, ctrl-gauche 131109 et alt-gauche. 262181.

Vous pouvez extraire les modificateurs et la touche enfoncée par AND avec les valeurs d'énumération appropriées :

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    bool shiftPressed = (keyData & Keys.Shift) != 0;
    Keys unmodifiedKey = (keyData & Keys.KeyCode);

    // rest of code goes here
}

Autres conseils

j'ai voté pour La réponse de Tokabi, mais pour comparer les clés, il y a quelques conseils supplémentaires sur StackOverflow.com ici.Voici quelques fonctions que j’ai utilisées pour tout simplifier.

   public Keys UnmodifiedKey(Keys key)
    {
        return key & Keys.KeyCode;
    }

    public bool KeyPressed(Keys key, Keys test)
    {
        return UnmodifiedKey(key) == test;
    }

    public bool ModifierKeyPressed(Keys key, Keys test)
    {
        return (key & test) == test;
    }

    public bool ControlPressed(Keys key)
    {
        return ModifierKeyPressed(key, Keys.Control);
    }

    public bool AltPressed(Keys key)
    {
        return ModifierKeyPressed(key, Keys.Alt);
    }

    public bool ShiftPressed(Keys key)
    {
        return ModifierKeyPressed(key, Keys.Shift);
    }

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (KeyPressed(keyData, Keys.Left) && AltPressed(keyData))
        {
            int n = code.Text.IndexOfPrev('<', code.SelectionStart);
            if (n < 0) return false;
            if (ShiftPressed(keyData))
            {
                code.ExpandSelectionLeftTo(n);
            }
            else
            {
                code.SelectionStart = n;
                code.SelectionLength = 0;
            }
            return true;
        }
        else if (KeyPressed(keyData, Keys.Right) && AltPressed(keyData))
        {
            if (ShiftPressed(keyData))
            {
                int n = code.Text.IndexOf('>', code.SelectionEnd() + 1);
                if (n < 0) return false;
                code.ExpandSelectionRightTo(n + 1);
            }
            else
            {
                int n = code.Text.IndexOf('<', code.SelectionStart + 1);
                if (n < 0) return false;
                code.SelectionStart = n;
                code.SelectionLength = 0;
            }
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top