2008-08-07 27 views
19

Ich bin neu in C# und arbeite in einer bestehenden Anwendung. Ich habe ein DirectX-Ansichtsfenster mit Komponenten, die ich mit den Pfeiltasten positionieren kann.C# und Pfeiltasten

Zur Zeit überschreibe ich ProcessCmdKey und fange Pfeileingabe ein und sende ein OnKeyPress-Ereignis. Dies funktioniert, aber ich möchte in der Lage sein, Modifikatoren zu verwenden (ALT +CTRL +SHIFT). Sobald ich einen Modifier halte und einen Pfeil drücke, werden keine Ereignisse ausgelöst, die ich höre.

Hat jemand irgendwelche Ideen oder Vorschläge, wohin ich damit gehen soll?

Antwort

10

Wie bestimmen Sie in Ihrem überschriebenen ProcessCmdKey, welche Taste gedrückt wurde?

Der Wert von keyData (der zweite Parameter) ändert sich abhängig von der gedrückten Taste und den Zusatztasten. Wenn Sie zum Beispiel den Pfeil nach links drücken, wird der Code 37 zurückgegeben, der Shift-Link 65573, der Ctrl-Link 131109 und alt-links 262181.

Sie können die Modifikatoren extrahieren und den Schlüssel durch uND-Verknüpfung mit entsprechenden eNUM-Werte gedrückt:

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, aber für den Vergleich von Schlüsseln gibt es einige zusätzliche Hinweise auf StackOverflow.com here. Hier sind einige Funktionen, mit denen ich alles vereinfachen konnte.

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