2009-06-19 73 views
11

我需要在窗体中捕获KeyUp事件(以切换“全屏模式”)。这是我在做什么:当子控件拥有焦点时,在窗体上捕获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事件,但表单上的控件是动态生成的,并且可能有很多 - 每个子控件都有自己的子项。

有没有办法做到这一点,而无需为屏幕上的每个控件生成事件处理程序(我肯定可以使用递归函数)?

回答

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),然后按钮处理程序也会被调用。

+0

简短而甜美。我喜欢! – Joseph 2009-06-19 14:47:50

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 
} 
+0

这也行,谢谢。 – 2009-06-19 14:47:10

相关问题