捕获UserControl中的KeyDown事件

Mar*_*ers 6 .net winforms c#-2.0

我有一个带有几个子控件的用户控件.我需要用户界面来响应按键,所以我决定将处理代码放在MainControl_KeyDown事件中.但是,当我在我的应用程序中按下某个键时,此事件不会触发.

我通过一个依赖于使用Windows API的搜索引擎找到了一个解决方案,我希望避免使用它,因为对于.NET框架正确支持的功能而言似乎有些过分.

Mas*_*oud 11

您可以添加以下方法给您usercontrol:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
   if ((keyData == Keys.Right) || (keyData == Keys.Left) ||
       (keyData == Keys.Up) || (keyData == Keys.Down))
   {
    //Do custom stuff
    //true if key was processed by control, false otherwise
    return true;
   }
   else
   {
    return base.ProcessCmdKey(ref msg, keyData);
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。当您处理嵌套控件等时,所有按键事件都会变得很复杂。这对我来说绝对有效。 (2认同)

Ska*_*lli 9

我知道这个线程有点旧,但我有一个类似的问题,并以不同的方式处理它:
在主窗口中,我将KeyPreview属性更改为true.我在用户控件中注册了主窗口的KeyDown事件处理程序.

this.Parent.KeyDown += new KeyEventHandler(MyControl_KeyDown);
Run Code Online (Sandbox Code Playgroud)

这可以防止我将每个子控件的KeyDown事件路由到我的用户控件.
当然,卸载用户控件时删除事件处理程序非常重要.

我希望这能帮助那些现在遇到类似问题的人.


Pat*_*ald 8

您可以为用户控件中的每个子控件添加一个KeyDown事件处理程序,并在每个控件中触发用户控件的KeyDown事件,如下所示:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    this.OnKeyDown(e);
}
Run Code Online (Sandbox Code Playgroud)