代码之家  ›  专栏  ›  技术社区  ›  Jon B

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

  •  11
  • Jon B  · 技术社区  · 17 年前

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

    在不为屏幕上的每个控件生成事件处理程序的情况下(我当然可以用递归函数来做这一点),是否有任何方法可以做到这一点?

    2 回复  |  直到 16 年前
        1
  •  12
  •   itsmatt    17 年前

    将窗体的keypreview设置为true,可以截获keypup事件。

    在我的测试应用程序中,我做了如下的事情:

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

        2
  •  5
  •   Joseph    17 年前

    您是否尝试在窗体上全局处理这些事件?

    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
    }
    
    推荐文章