Захват события KeyUp в форме, когда дочерний элемент управления имеет фокус - PullRequest
11 голосов
/ 19 июня 2009

Мне нужно захватить событие 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 из дочернего элемента управления, но элементы управления в форме генерируются динамически, и их может быть много - каждый из них имеет много собственных дочерних элементов.

Есть ли способ сделать это без генерации обработчиков событий для каждого элемента управления на экране (что я, безусловно, мог бы сделать с рекурсивной функцией)?

Ответы [ 2 ]

12 голосов
/ 19 июня 2009

Установите для 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), и тогда будет вызван и обработчик кнопки.

5 голосов
/ 19 июня 2009

Вы пытались обрабатывать события глобально в вашей форме?

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...