2010-05-07 11 views
12

Dans mon application Windows Forms, je souhaite qu'un bouton spécial exécute un test chaque fois que j'appuie dessus. Il y a des douzaines de contrôles donc l'implémenter dans chacun prend trop de temps.Touche de raccourci (non globale) dans Windows Forms .NET

Y at-il un moyen de définir une touche de raccourci, alors, peu importe ce que je fais dans l'application, je peux appuyer sur la touche, et il va déclencher mon événement?

Répondre

15

Vous pouvez remplacer ProcessCmdKey et gérer vos raccourcis clavier il, que ce soit dans un contrôle ou une forme.

De MSDN:

La méthode de ProcessCmdKey premier détermine si la commande a une ContextMenu, et si oui, permet à l' ContextMenu pour traiter la touche de commande . Si la clé de commande n'est pas un raccourci de menu et que le contrôle a un parent, la clé est transmise à la méthode ProcessCmdKey du parent . L'effet net est que les touches de commande sont "bulles" la hiérarchie de contrôle. En plus de la touche , la touche indique également quelles touches ont été enfoncées en même temps que la touche . Les touches de modification incluent les touches SHIFT, CTRL et ALT .

Par exemple:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    // if it is a hotkey, return true; otherwise, return false 
    switch (keyData) 
    { 
     case Keys.Control | Keys.C: 
      // do something 
      return true; 
     default: 
      break; 
    } 

    return base.ProcessCmdKey(ref msg, keyData); 
} 
1

Si vous avez un seul formulaire. Vous pouvez définir Form.KeyPreview = true, puis ajouter du code à l'événement clé du formulaire.

4

Vous pouvez substituer la méthode ProcessCmdKey() d'un formulaire, il s'exécute avant que tout contrôle sur le formulaire ne voit le coup de clé. Si vous avez vraiment besoin que ce soit au niveau de l'application (tous les formulaires), alors vous devez avoir votre formulaire principal pour implémenter l'interface IMessageFilter. Par exemple:

public partial class Form1 : Form, IMessageFilter { 
    public Form1() { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
     this.FormClosed += (o, e) => Application.RemoveMessageFilter(this); 
    } 
    public bool PreFilterMessage(ref Message m) { 
     // Catch WM_KEYDOWN message 
     if (m.Msg == 0x100 && (Keys)m.WParam == Keys.F1) { 
      MessageBox.Show("Help me!"); 
      return true; 
     } 
     return false; 
    } 
} 
+0

ProcessCmdKey FTW –

+0

j'avais celui marqué accepter, mais alors j'ai vu écrire zach 'retourner base.ProcessCmdKey (réf msg, keyData),' et je me sentais comme un idiot (J'utilise pour le faire mais j'ai iddnt cette fois) et mis à jour mon code. Il l'obtient pour avoir sa réponse qui me rappelle mon erreur. Bien que vous ayez plus de réponses. C'était un choix difficile. –