2010-07-14 6 views
3

Je voudrais créer un gestionnaire commun de tous les clics droits (ou éventuellement un autre comportement unique comme le bouton du milieu, etc.) se produisant dans mon application. Ils invoqueraient la même action, par ex. ouvrir la boîte de dialogue pour personnaliser le contrôle sur lequel vous avez cliqué ou afficher la boîte de dialogue d'aide correspondante.Gestionnaire commun pour tous les clics droits

Existe-t-il un mécanisme qui me permettrait d'intercepter tous les événements de clic dans l'application, chacun fournissant une référence au contrôle sur lequel le clic s'est produit? La solution de force brute serait d'utiliser la réflexion pour parcourir tous les contrôles dans toutes les formes que je crée et y attacher un gestionnaire, mais je cherche quelque chose de plus clair.

+0

Qu'est-ce que vous signifie "en application"? Sur la forme? Conteneurs (panneau, groupbox)? sur les contrôles (bouton, zone de texte, case à cocher)? .. – serhio

+0

Fondamentalement, je veux attraper des clics sur les éléments de l'interface utilisateur, en particulier les contrôles comme bouton, étiquette, case à cocher pour permettre leur personnalisation facile grâce à un moteur de configuration que j'ai créé. Dans mon moteur de configuration je passe en revue tous les champs sous-type de Control, DataGridViewColumn, ToolStripItem et applique les personnalisations stockées dans la configuration pour un client donné. Maintenant, je veux facilement faire apparaître une fenêtre pour créer ces personnalisations sur des éléments d'interface utilisateur donnés. – nazgul

Répondre

1

Vous pouvez essayer d'implémenter l'interface IMessageFilter sur votre formulaire. Il y a plusieurs autres discussions et documents à ce sujet. Une solution possible pour que vous pourriez ressembler à (créer un formulaire, placez un bouton, ajoutez le code nécessaire d'en bas, exécuter et essayer clic droit sur la forme et sur le bouton):

using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace WindowsApplication1 
{ 
    public partial class Form1 : Form, IMessageFilter 
    { 
     private const int WM_RBUTTONUP = 0x0205; 

     [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 
     public static extern IntPtr GetCapture(); 

     public Form1() 
     { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
     } 

     public bool PreFilterMessage(ref Message m) 
     { 
     if (m.Msg == WM_RBUTTONUP) 
     { 
      System.Diagnostics.Debug.WriteLine("pre wm_rbuttonup"); 

      // Get a handle to the control that has "captured the mouse". This works 
      // in my simple test. You can read the documentation and do more research 
      // on it if you'd like: 
      // http://msdn.microsoft.com/en-us/library/ms646257(v=VS.85).aspx 
      IntPtr ptr = GetCapture(); 
      System.Diagnostics.Debug.WriteLine(ptr.ToString()); 

      Control control = System.Windows.Forms.Control.FromChildHandle(ptr); 
      System.Diagnostics.Debug.WriteLine(control.Name); 

      // Return true if you want to stop the message from going any further. 
      //return true; 
     } 

     return false; 
     } 
    } 
} 
Questions connexes