2009-11-10 15 views
2

Je substitue ProcessCmdKey() dans ma classe de formulaire parent MDI et possède une méthode d'appel de raccourci clavier dans la même classe. Mais je souhaite que ces raccourcis fonctionnent sous la forme de parent/enfant et d'autre forme. Le cas est maintenant lorsque focus sur l'autre forme (forme régulière, pas MDI), ProcessCmdKey() ne capture plus le clavier. Dans quelle classe devrais-je placer ProcessCmdKey() et quoi que ce soit pour le faire fonctionner? Merci!Essayez d'implémenter le raccourci clavier global sous forme MDI parent/enfant et autre à l'aide de ProcessCmdKey

namespace myNamespace 
{ 
    public class MDIParent : System.Windows.Forms.Form 
    { 

     public bool NextTab(){...} 
     public bool PreviousTab(){...} 

     protected override bool ProcessCmdKey(ref Message message, Keys keys) 
     { 
      switch (keys) 
      { 
       case Keys.Control | Keys.Tab: 
        NextTab(); 
        return true; 

       case Keys.Control | Keys.Shift | Keys.Tab: 
        PreviousTab(); 
        return true; 
      } 
      return base.ProcessCmdKey(ref message, keys); 
     } 
    } 

    public class mySecondForm : System.Windows.Forms.Form 
    { 
     ... 
    } 
} 
+0

Il s'avère que le problème provient de mon formulaire enfant, qui a ouvert une fenêtre de bureau distant (objet AxMSTSCLib.AxMsRdpClient2), capture l'événement clavier/souris du niveau inférieur et rend le processus ProcessCmdKey prioritaire ne fonctionnant pas. On dirait que je dois trouver un autre moyen ... Merci quand même, BillW. – Scud

Répondre

1

Vous pouvez définir une forme de « base » avec votre gestionnaire de ProcessCmdKey mis en œuvre, puis faire toutes vos autres formes: le MDI Parent, Windows enfant du parent MDI, et tout « indépendants » que vous créez (c'est-à-dire, pas les enfants du formulaire MDI) héritent du "formulaire de base". Assurez-vous simplement que la propriété IsMdiContainer est définie sur le formulaire que vous souhaitez être MDI et que les fenêtres enfants que vous ajoutez au formulaire MDI ne sont pas TopLevel et que leur parent est défini sur le formulaire MDI.

La question est, alors, où voulez-vous gérer les événements déclenchés par les combinaisons de touches que vous avez activées parce que ... si vous définissez les méthodes à déclencher par les combinaisons de touches piégées dans le formulaire de base ... Chaque formulaire qui hérite du formulaire de base va les exécuter dans leur propre contexte.

Si vous souhaitez gérer les combinaisons de touches interceptées sur une base d'application étendue, implémentez une classe publique statique avec les gestionnaires de combinaison de clés définis comme des méthodes statiques. Ou, puisque vous pouvez vouloir savoir à partir de quel formulaire les combinaisons de touches spéciales émises juste passent un pointeur à appeler Formulaire au gestionnaire statique.

Ainsi, votre gestionnaire pour le contrôle + Tab dans la commande prioritaire ProcessCmdKey dans la forme de base pourrait ressembler à ceci:

// in ProcessCmdKey override in base Form 
    case Keys.Control | Keys.Tab: 
     KeyHandler.NextTabHandler(this); 
     return true; 

Votre classe statique pourrait ressembler à ceci:

public static class KeyHandler 
{ 
    public static void NextTabHandler(Form theCallingForm) 
    { 
     Console.WriteLine("called from : " + theCallingForm.Text + " : ActiveControl : " + theCallingForm.ActiveControl.Name); 

     if (theCallingForm is MDIForm) 
     { 
      // handle Next Tab on MDIForm control 
     } 
     else if (theCallingForm is childForm) 
     { 
      // handle Next Tab on ChildForm control 
     } 
     else 
     { 
      if(theCallingForm is independentForm) 
      { 
       // handle Next Tab on "independent Form" control 
      } 
     } 
    } 
} 

Comme vous pouvez voir dans le code ci-dessus, vous pouvez utiliser la propriété ActiveControl du formulaire appelant pour savoir quel contrôle sur un type donné de formulaire a obtenu la combinaison de clés. Bien sûr, si vous ne voulez pas manipuler les combinaisons de touches "globalement" comme ceci, il vous suffit d'insérer vos remplacements ProcessCmdKey selon les besoins dans les autres formulaires, et de ne pas les hériter de la base. Forme.

La gestion des événements clés «application large» peut être ou ne pas être la meilleure stratégie pour votre solution particulière, mais c'est une stratégie viable. best,