0

クラスを作成するフォームがあります。このクラスは、フォームで発生するイベントを処理します。問題は、KeyDown イベントを使用しようとしていますが、フォームにボタンがあり、KeyDown をキャプチャしているため、機能していません。別の投稿で解決策が ProcessCmdKey をオーバーライドすることであることがわかりました。問題は、別のクラス内からメソッドをオーバーライドする方法がわからないことです。他のクラス内からすべての KeyDown イベントをキャプチャする方法を誰か教えてもらえますか?

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.Left)
    {
        MoveLeft(); DrawGame(); DoWhatever();
        return true; //for the active control to see the keypress, return false
    }
    else if (keyData == Keys.Right)
    {
        MoveRight(); DrawGame(); DoWhatever();
        return true; //for the active control to see the keypress, return false
    }
    else if (keyData == Keys.Up)
    {
        MoveUp(); DrawGame(); DoWhatever();
        return true; //for the active control to see the keypress, return false
    }
    else if (keyData == Keys.Down)
    {
        MoveDown(); DrawGame(); DoWhatever();
        return true; //for the active control to see the keypress, return false
    }
    else
        return base.ProcessCmdKey(ref msg, keyData);
}
4

2 に答える 2

0

これを行う最も簡単な方法は、含まれているフォームでKeyDownfromを公開することです。Button

class MyForm : Form { 
  Button m_button;

  public event KeyEventHandler ButtonKeyDown;

  public MyForm() { 
    m_button = ...;
    m_button.KeyDown += delegate (object, e) {
      KeyEventHandler saved = ButtonKeyDown;
      if (saved != null) { 
         saved(object, e);
      }
    };
  }
}

MyForm::ButtonKeyDownこれで、呼び出しコードはイベントに簡単にフックできます

于 2013-07-24T21:42:16.777 に答える