Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当子控件具有焦点时捕获窗体上的KeyUp事件_C#_.net_Winforms_Event Handling - Fatal编程技术网

C# 当子控件具有焦点时捕获窗体上的KeyUp事件

C# 当子控件具有焦点时捕获窗体上的KeyUp事件,c#,.net,winforms,event-handling,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 } 除非窗体

我需要在表单中捕获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事件,但是表单上的控件是动态生成的,可能有很多控件,每个控件都有自己的多个子控件


有没有办法在不为屏幕上的每个控件生成事件处理程序的情况下实现这一点(我当然可以使用递归函数实现)?

您是否尝试过在窗体上全局处理事件

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
}

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

这正是我需要的!非常感谢!