2008-08-07 26 views
19

私はC#を初めて使用しており、既存のアプリケーションでいくつかの作業を行っています。矢印キーを使用して配置できるようにするコンポーネントがあるDirectXビューポートがあります。C#と矢印キー

現在、私はProcessCmdKeyをオーバーライドして矢印入力を受け取り、OnKeyPressイベントを送信しています。これは動作しますが、私は(ALT、CTRL +SHIFT + )を修飾子を使用することができるようにしたいです。私が修飾子を持って矢印を押すとすぐに、私が聞いているイベントは発生しません。

私はこれと一緒にどこに行かなければならないのですか?

答えて

10

オーバーライドされたProcessCmdKey内でどのキーが押されたかはどのように判断していますか?

キーの値(2番目のパラメータ)は、押されたキーと任意の修飾キーによって変わります。たとえば、左矢印を押すとコード37が、シフト左には65573、Ctrl-左に131109そして、ALT-左262181.

あなたが修飾し、適切な列挙値との論理積をとることにより、押されたキーを取り出すことができます。

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

私はTokabi's answerをupvotedが、比較キーのStackOverflow.com here上のいくつかの追加のアドバイスがあります。ここでは、すべてを簡素化するために使用したいくつかの関数を示します。

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); 
    } 
関連する問題