web-dev-qa-db-fra.com

Comment capturer Keys.F1 indépendamment du contrôle concentré sur un formulaire?

J'ai utilisé l'événement KeyDown et du code simple comme if (e.KeyCode == Keys.F1) pour capturer F1 est appuyé sur un formulaire MAIS s'il y a des zones de texte sur le formulaire ou s'il y a des feuilles de calcul avec Dock Fill sur le formulaire puis le code ci-dessus devient inutile et ne fait rien. Mais je veux faire quelque chose lorsque l'utilisateur appuie sur F1 sur ce formulaire. alors comment capturer un événement de keydown spécifique comme F1 sur l'ensemble du formulaire ... et je ne veux pas aller sur la route qui capture le KeyDown de tous les autres contrôles du formulaire et les transmettre au formulaire pour traitement. existe-t-il un moyen plus propre de le faire?

29
Bohn

Oui, bien sûr. La façon correcte pour le formulaire de gérer les événements clés, quel que soit le contrôle qui a actuellement le focus d'entrée, est de remplacer la méthode ProcessCmdKey de votre classe de formulaire:

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

Vous retournez true pour indiquer que vous avez géré la frappe et ne voulez pas qu'elle soit transmise à d'autres contrôles. Si vous voulez qu'il soit transmis aux gestionnaires d'événements pour d'autres contrôles, renvoyez simplement false.

Et il vaut mieux ignorer la propriété KeyPreview . C'est un anachronisme des VB 6 jours et ce n'est pas vraiment la manière préférée de le faire dans le monde .NET. Pour en savoir plus: Inconvénient de définir Form.KeyPreview = true? =

60
Cody Gray

Définissez KeyPreview du formulaire sur true. Cela garantira que le formulaire obtiendra les messages de pression en premier et si vous le gérez, vous pouvez définir e.Handled = true afin qu'il ne soit pas transmis aux commandes.

5
Bala R

Activez KeyPreview et chaque pression de touche dans le formulaire sera d'abord acheminée via ses principaux gestionnaires d'événements.

4
Blindy
3
JTorrecilla