2008-08-07 31 views
19

Soy nuevo en C# y estoy trabajando en una aplicación existente. Tengo una ventana gráfica de DirectX que tiene componentes que quiero ubicar con las teclas de flecha.C# y teclas de flecha

Actualmente estoy anulando ProcessCmdKey y capturando entrada de flecha y enviando un evento OnKeyPress. Esto funciona, pero yo quiero ser capaz de utilizar modificadores (ALT +CTRL +SHIFT). Tan pronto como sostengo un modificador y presiono una flecha, no se activan los eventos que estoy escuchando.

¿Alguien tiene alguna idea o sugerencia sobre dónde debo ir con esto?

Respuesta

10

Dentro de su ProcessCmdKey reemplazado, ¿cómo está determinando qué tecla se ha presionado?

El valor de keyData (el segundo parámetro) cambiará dependiendo de la tecla presionada y las teclas modificadoras, por lo que, por ejemplo, presionar la flecha izquierda devolverá el código 37, shift-left devolverá 65573, ctrl-left 131109 y alt-izquierda 262181.

puede extraer los modificadores y la tecla pulsada por AND con los valores de enumeración apropiados:

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

I upvoted Tokabi's answer, pero para comparar claves hay algunos consejos adicionales sobre StackOverflow.com here. Aquí hay algunas funciones que utilicé para ayudar a simplificar todo.

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