从另一个类C#重写KeyDown

本文关键字:重写 KeyDown 另一个 | 更新日期: 2023-09-27 18:24:52

我有一个创建类的窗体。这个类处理在窗体上激发的事件。问题是我试图使用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);
}

从另一个类C#重写KeyDown

最简单的方法是在包含表单上公开Button中的KeyDown

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事件

我不确定如何将事件与类连接起来,但如果将表单的KeyPreview属性设置为True,则可以在那里获取事件,然后将其传递给正在处理事件的类。因此,即使按钮有焦点,KeyDown也会在窗体上触发事件。

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    ... Invoke your class
}