Manejo de un clic para todos los controles en un formulario

Tengo un .NET UserControl (FFX 3.5). Este control contiene varios controles secundarios: un panel, un par de tags, un par de cuadros de texto y otro control personalizado. Quiero hacer clic con el botón derecho en cualquier parte de la base Control, de modo que haga clic con el botón derecho en cualquier control secundario (o hijo de un niño en el caso del Panel). Me gustaría hacerlo para que pueda mantenerse si alguien realiza cambios en el Control sin tener que cablear en controladores para nuevos Controles, por ejemplo.

Primero intenté sobreescribir el WndProc, pero como sospechaba, solo recibí mensajes para los clics en el Formulario directamente, no en ninguno de sus hijos. Como semi-hack, agregué lo siguiente después de InitializeComponent:

foreach (Control c in this.Controls) { c.MouseClick += new MouseEventHandler( delegate(object sender, MouseEventArgs e) { // handle the click here }); } 

Ahora recibe clics para los controles que admiten el evento, pero las tags, por ejemplo, todavía no obtienen nada. ¿Hay una manera simple de hacer esto que estoy pasando por alto?

Si las tags están en un subcontrol, tendrías que hacer esto recursivamente:

 void initControlsRecursive(ControlCollection coll) { foreach (Control c in coll) { c.MouseClick += (sender, e) => {/* handle the click here */}); initControlsRecursive(c.Controls); } } /* ... */ initControlsRecursive(Form.Controls); 

Para gestionar un evento MouseClick , haga clic con el botón derecho en todos los controles de un UserControl personalizado:

 public class MyClass : UserControl { public MyClass() { InitializeComponent(); MouseClick += ControlOnMouseClick; if (HasChildren) AddOnMouseClickHandlerRecursive(Controls); } private void AddOnMouseClickHandlerRecursive(IEnumerable controls) { foreach (Control control in controls) { control.MouseClick += ControlOnMouseClick; if (control.HasChildren) AddOnMouseClickHandlerRecursive(control.Controls); } } private void ControlOnMouseClick(object sender, MouseEventArgs args) { if (args.Button != MouseButtons.Right) return; var contextMenu = new ContextMenu(new[] { new MenuItem("Copy", OnCopyClick) }); contextMenu.Show((Control)sender, new Point(args.X, args.Y)); } private void OnCopyClick(object sender, EventArgs eventArgs) { MessageBox.Show("Copy menu item was clicked."); } }