Básicamente, tengo un formulario con un control personalizado (y nada más). El control personalizado está completamente vacío y el formulario tiene KeyPreview establecido en verdadero.Eventos de tecla de flecha que no llegan
Con esta configuración, no estoy recibiendo ningún evento KeyDown para ninguna tecla de flecha o pestaña. Cada otra clave que tengo en mi teclado funciona. Tengo controladores de eventos KeyDown conectados a todo lo que tiene tales eventos, así que estoy seguro de que no me falta nada.
También es de destacar que si elimino el control personalizado (completamente vacío), SI recibo los eventos de la tecla de flecha.
¿Qué diablos está pasando aquí?
EDIT:
he añadido esto a la forma y el control, pero todavía no recibo teclas de flecha:
protected override void WndProc(ref Message m) {
switch (m.Msg) {
case 0x100: //WM_KEYDOWN
//this is the control's version. In the form, it's this.Text
ParentForm.Text = ((Keys)m.WParam).ToString();
break;
}
base.WndProc(ref m);
}
También he comprobado con Spy ++, y determinó que el propio formulario no recibe ningún mensaje WM_KEYDOWN, todos van al control. Sin embargo, dicho esto, el control recibe los mensajes de la tecla de flecha WM_KEYDOWN. Suspiro.
Editar 2: También actualicé el archivo ZIP con esta versión. Por favor, mire, si usted quiere ayudar ...
Datos 3:
He cuenta de esto, más o menos. La forma es comer las teclas de flecha, probablemente en un intento de mantener el foco entre sus hijos. Esto se demuestra por el hecho de que SI obtengo los eventos si el formulario está vacío.
De todos modos, si añado este código a la forma, que comienza a recibir los eventos de nuevo:
public override bool PreProcessMessage(ref Message msg) {
switch (msg.Msg) {
case 0x100: //WM_KEYDOWN
return false;
}
return base.PreProcessMessage(ref msg);
}
Cuando puedo reemplazar esto, la forma no consigue la oportunidad de hacer su trabajo sucio, y así Obtengo mis eventos KeyDown como espero. Supongo que un efecto secundario de esto es que ya no puedo usar mi teclado para navegar por el formulario (no es un gran problema en este caso, ya que es un juego, ¡y el propósito de este ejercicio es implementar la navegación por teclado!)
La pregunta sigue siendo acerca de cómo deshabilitar esta "correctamente", si hay una manera ...
Parece que la forma en la que está el control de usuario es capturar el evento y configurarlo para que lo maneje antes de que UserControl lo reciba. ¿Está asegurando que su control de usuario se enfoque cuando se presiona la tecla? –