16

I have a parent form that contains a lot of controls. What I am trying to do is filter all of the key presses for that form. The trouble is that if the focus is on one of the controls on the form then the parent form is not getting the key press event, so how do I capture the key down event?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
flavour404
  • 6,184
  • 30
  • 105
  • 136

2 Answers2

45

Set KeyPreview to true on your form and you will catch them: MSDN

RvdK
  • 19,580
  • 4
  • 64
  • 107
8

This will only work on form, but not if any other component is in focus

public partial class ChildForm : Form
{

    public ChildForm()
    {       
       KeyPress += KeyPressHandler;
    }

    public KeyPressHandler(object sender, KeyPressEventArgs e)
    {
       if (_parent != null)
       {
           _parent.NotifyKeyPress(e);
       } 
    }
}

This will work even when other components are in focus

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.F1)
    {
        MessageBox.Show("You pressed the F1 key");
        return true;    // indicate that you handled this keystroke
    }

    // Call the base class
    return base.ProcessCmdKey(ref msg, keyData);
}
kv1dr
  • 203
  • 4
  • 14