Как поймать нажатие клавиши на форме С#.NET

У меня есть родительская форма, содержащая множество элементов управления. То, что я пытаюсь сделать, - это фильтр всех нажатий клавиш для этой формы. Проблема в том, что если фокус находится на одном из элементов управления формы, то родительская форма не получает ключевое событие нажатия клавиши, так как я могу захватить событие с нажатием клавиши?

Ответы

Ответ 1

Установите KeyPreview в true в вашей форме, и вы поймаете их: MSDN

Ответ 2

Это будет работать только на форме, но не в том случае, если в фокусе находится любой другой компонент

public partial class ChildForm : Form
{

    public ChildForm()
    {       
       KeyPress += KeyPressHandler;
    }

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

Это будет работать, даже когда другие компоненты находятся в фокусе

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);
}