Захват события KeyUp в форме, когда дочерний элемент управления имеет фокус
Мне нужно захватить событие 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 из дочернего элемента управления, но элементы управления формы генерируются динамически, и их может быть много - каждый из них имеет много собственных детей.
Есть ли способ сделать это без создания обработчиков событий для каждого элемента управления на экране (что я, конечно, мог бы сделать с рекурсивной функцией)?
Ответы
Ответ 1
Установите форму 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), и тогда обработчик кнопки также будет вызван.
Ответ 2
Вы пытались обработать события по всему миру в своей форме?
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
}