2009-06-19 8 views
11

Je dois capturer l'événement KeyUp dans mon formulaire (pour basculer entre "mode plein écran"). Voici ce que je fais:Capture d'un événement KeyUp sur un formulaire lorsque le contrôle enfant a le focus

protected override void OnKeyUp(KeyEventArgs e) 
{ 
    base.OnKeyUp(e); 

    if (e.KeyCode == Keys.F12) this.ToggleFullScreen(); 
} 

private void ToggleFullScreen() 
{ 
    // Snazzy code goes here   
} 

Cela fonctionne très bien, sauf si un contrôle sur le formulaire a un focus. Dans ce cas, je ne reçois pas l'événement du tout (aussi essayé OnKeyDown - pas de chance là non plus).

Je pouvais gérer l'événement KeyUp à partir du contrôle enfant, mais les contrôles sur le formulaire sont générés dynamiquement, et il peut y avoir beaucoup d'entre eux - chacun ayant plusieurs enfants de leur propre.

Y at-il un moyen de le faire sans générer de gestionnaires d'événements pour chaque contrôle sur l'écran (ce que je pourrais certainement faire avec une fonction récursive)?

Répondre

12

Définissez KeyPreview du formulaire sur true et vous pouvez intercepter l'événement KeyUp.

Dans mon application de test je fait quelque chose comme ceci:

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

Il va vider la ligne de trace de forme, la poignée de la clé et le gestionnaire de bouton ne sera pas appelé. Vous ne pouvez, bien sûr, pas gérer l'événement (pas le e.Handled = true) et le gestionnaire de bouton sera également appelé.

+0

Court et doux. J'aime ça! – Joseph

+0

Juste ce dont j'avais besoin! Parfait merci! –

5

Avez-vous essayé de gérer les événements globalement sur votre formulaire?

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

Cela fonctionne aussi, merci. –

Questions connexes