2008-08-07 15 views
19

Jestem nowy w C# i robię trochę pracy w istniejącej aplikacji. Mam rzutnię DirectX, która zawiera komponenty, które chcę móc ustawić za pomocą klawiszy strzałek.C# i klawisze strzałek

Obecnie nadpisuję klucz ProcessCmdKey i przechwytuję wejście ze strzałką i wysyłam zdarzenie OnKeyPress. To działa, ale chcę, aby móc użyć modyfikatorów (ALT + CTRL + SHIFT). Jak tylko zatrzymam modyfikator i naciśniesz strzałkę, żadne zdarzenia nie zostaną wywołane, a ja słucham.

Czy ktoś ma jakieś pomysły lub sugestie dotyczące tego, gdzie powinienem się z tym skontaktować?

Odpowiedz

10

W swoim nadpisanym kluczu ProcessCmdKey w jaki sposób określasz, który klawisz został naciśnięty?

Wartość keyData (drugi parametr) zmieni się w zależności od naciśniętego klawisza i wszystkich klawiszy modyfikujących, dzięki czemu np. Naciśnięcie lewej strzałki spowoduje powrót do kodu 37, shift-left spowoduje powrót 65573, ctrl-left 131109 i alt-lewo 262181.

można wyodrębnić modyfikatorów i klawisz wciśnięty przez logiczne jakiegokolwiek z odpowiednimi wartościami eNUM:

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, ale do porównywania kluczy jest jakaś dodatkowa rada na StackOverflow.com here. Oto kilka funkcji, których użyłem, aby uprościć wszystko.

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