2009-06-19 2 views
11

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

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

ответ

12

Задайте форму 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), и тогда обработчик кнопки будет вызван.

+0

Короткие и сладкие. Мне это нравится! – Joseph

+0

Просто то, что мне нужно! Прекрасное спасибо! –

5

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

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 
} 
+0

Это тоже работает, спасибо. –

Смежные вопросы