从另一个类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);
}
最简单的方法是在包含表单上公开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
}