当子控件具有焦点时,在窗体上捕获KeyUp事件

时间:2009-06-19 14:36:41

标签: c# .net winforms event-handling

我需要在表单中捕获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 个答案:

答案 0 :(得分: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),然后也会调用按钮处理程序。

答案 1 :(得分: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
}