2008-08-07 29 views
19

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

Actuellement, je surcharge ProcessCmdKey et attrape l'entrée de la flèche et envoie un événement OnKeyPress. Cela fonctionne, mais je veux être en mesure d'utiliser les modificateurs (ALT +CTRL +SHIFT). Dès que je tiens un modificateur et que j'appuie sur une flèche, aucun événement n'est déclenché que j'écoute.

Est-ce que quelqu'un a des idées ou des suggestions sur où je devrais aller avec cela?

Répondre

10

Dans votre ProcessCmdKey surchargée, comment déterminez-vous quelle touche a été enfoncée? La valeur de keyData (le second paramètre) changera en fonction de la touche enfoncée et des touches de modification, ainsi, par exemple, si vous appuyez sur la flèche gauche, le code 37 sera renvoyé, shift-left 65573, ctrl-left 131109 et alt gauche 262181.

Vous pouvez extraire les modificateurs et la touche appuyée par ANDing avec des valeurs ENUM 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 
} 
6

J'upvoted Tokabi's answer, mais pour comparer les clés il y a quelques conseils supplémentaires sur StackOverflow.com here. Voici quelques fonctions que j'ai utilisées pour simplifier tout.

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); 
    }