2011-09-14 11 views
5

Tengo un problema con la configuración del mismo controlador de eventos para todos los controles en el formulario. Quiero controlar los botones f5-f7 presionados uniformemente en mi aplicación, por lo que trato de registrar el mismo controlador de eventos para todos los controles en el formulario. InsertéUn controlador de eventos para todos los controles en el formulario

foreach (System.Windows.Forms.Control cont in this.Controls) 
       cont.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MainForm_KeyPress); 

en función InitializeComponent() justo antes genera automáticamente ResumeLayout/PerformLayout llama. No importa el nombre MainForm_KeyPress, en realidad es un controlador de eventos KeyDown ahora.

También traté de insertar el código en mi función init() que se llama desde el constructor. Pero el resultado fue el mismo: el evento no ocurre cuando presiono las teclas. El foco está en uno de los botones del formulario.

Pero si implemento el controlador para uno de los botones usando la herramienta de diseño (copiar el nombre de la función al campo de evento KeyPress), el evento se levanta correctamente si el botón está enfocado.

¿Alguna idea de por qué foreach no funcionó?

+3

¿Un manejador de eventos para gobernarlos a todos? – jason

+0

Por favor, no ponga un prefijo a sus títulos con "C#:". Para eso son las etiquetas. –

+0

@Jason - y en la oscuridad los datos, únelos. – TrueWill

Respuesta

6

MSDN dice que puede hacer con la configuración KeyPreview en verdadero.

+0

Este parece el camino a seguir, solo tendría un registro de evento, a nivel de formulario. Solo asegúrate de configurar e.Handled en true para los eventos clave que realmente manejas (para evitar acciones dobles) y falso para todos los demás (o desactivas todas las otras interacciones con el teclado, creo).El código de ejemplo en MSDN es un poco simplista en la forma en que lo establece en falso en todos los casos. – rice

+0

@Ingenu ¡gracias! ¡Una respuesta tan fácil! – HtonS

+0

@Ingenu muchas gracias –

1

Quizás necesite recurse y registrarlo para los controles secundarios de cada control que encuentre, en el árbol?

Lo primero que haría al tener este problema es colocar {} alrededor del registro y dar como resultado "ahora registrarme para" + el nombre del control. De esta forma, puede ver y ver cuántos controles se están registrando y cuáles son. Tal vez es solo el panel principal, y los subcontroles procesan la tecla hacia abajo? También tuve problemas con los manejadores de eventos de pulsación de tecla al trabajar en un dockmanager, el dockmanager manejaba el teclado en otro nivel y enrutaba el evento al control secundario específico que creía que debería obtenerlo.

Si aún no lo resuelves, lo siguiente que haré es conectar los eventos del formulario, o incluso controlar los eventos del mensaje WM_ windows. En algún momento, el WM_ se traduce a un evento .NET por código, y esto puede implementarse de maneras que no espera, y es secuestrado por controles de terceros, etc. El sistema operativo debe enrutar los eventos WM_ a su proceso. , así que rastrearlos con controladores de eventos de paso que registran lo que pasa.

Olvidé exactamente cómo funciona, pero cuando proceso un evento como una pulsación de tecla, puede devolver un bool o establecer una bandera en el evento diciendo que lo ha manejado, y en la implementación de dockmanager vi si lo dijo manejado, el ciclo que pasaba el evento a los controles secundarios se detendría, imponiendo la idea de que el evento del teclado debe desencadenar solo una acción.

+0

Vi tu respuesta primero y seguí tus consejos para verificar si todos los controles se procesaron en foreach. Tenías razón, los controles secundarios no estaban registrados. Así que agregué una recursión, y todo funcionó bien. Pero la respuesta de Ingenu es más simple, así que la usaré =) ¡Gracias de nuevo! Es una lástima que no pueda marcar dos publicaciones como respuesta – HtonS

Cuestiones relacionadas