当子控件获得焦点时,如何在窗体上捕获KeyUp事件

11

我需要在表单中捕获KeyUp事件(以切换“全屏模式”)。 这是我正在做的事情:

protected override void OnKeyUp(KeyEventArgs e)
{
    base.OnKeyUp(e);

    if (e.KeyCode == Keys.F12) this.ToggleFullScreen();
}

private void ToggleFullScreen()
{
    // Snazzy code goes here           
}

这段代码本来很好用,但是如果表单上的控件有焦点时就无效了。在那种情况下,我根本就收不到按键事件(试过使用OnKeyDown也不行)。

我可以从子控件处理KeyUp事件,但是表单上的控件是动态生成的,而且可能有很多个 - 每个控件都有自己的多个子控件。

有没有一种方法可以在屏幕上的每个控件上都执行此操作,而不必为每个控件生成事件处理程序呢?(使用递归��数当然可以做到这一点)

2个回答

12

将表单的 KeyPreview 属性设置为 true,即可拦截 KeyUp 事件。

在我的测试应用程序中,我做了类似于以下的操作:

this.KeyPreview = true;
.
.
.


private void button1_KeyUp(object sender, KeyEventArgs e)
{
    Trace.WriteLine("button key up");
}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    Trace.WriteLine("form key up");
    e.Handled = true;
}

它将会输出表单跟踪行,处理键盘弹起事件,而按钮处理程序不会被调用。当然,您也可以不处理该事件(不进行e.Handled = true),那么按钮处理程序也会被调用。


5

你尝试过在表单上全局处理事件吗?

protected override bool ProcessCmdKey(ref Message msg, Keys e)
{
    if (e.KeyCode == Keys.F12) 
    {
       this.ToggleFullScreen();
       return true; //marks command as handled
    }

    return base.ProcessCmdKey(ref msg, e); // Resend To Base Function
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接