2012-05-06 16 views
12

Estoy tratando de obtener alguna respuesta del teclado en una pequeña prueba de Windows Form Application, y tengo una solución aproximada, que es anular ProcessCmdKey. Sin embargo, hay varios problemas que estoy encontrando e incoherencias que estoy encontrando.Eventos clave: ProcessCmdKey

diferentes eventos: ¿Hay una manera de decir, en los argumentos ref Message msg, Keys keyData, incluso si el es un KeyDown, KeyUp una o pulsar una tecla?

KeyPress: Por todas partes que he buscado dice que KeyPress, es decir, una entrada de teclado repetida, solo ocurre para las teclas de caracteres, que no son las teclas de flecha. Sin embargo, el controlador de eventos se llama con la misma frecuencia, y en el mismo orden/con el mismo comportamiento, para las teclas de flecha como teclas de caracteres. ¿Es esto un evento de KeyPress, o es algo más?

Lo ideal sería que me gustara una forma de manejar, a nivel de formulario, todos los eventos del teclado sin permitir que pasen a los controles en el formulario. Sin embargo, toda la documentación me confundió lo suficiente y omití los puntos clave, por lo que no he podido completar esto.

Se agradece la ayuda sobre cualquiera de estos temas. ¡Gracias!

Respuesta

12

La estructura Message pasado a ProcessCmdKey() contiene el número de mensaje WINAPI en su propiedad Msg:

  • WM_KEYDOWN es 0x100 (256),
  • WM_KEYUP es 0x101 (257),
  • WM_CHAR (aproximadamente equivalente a KeyPress) es 0x102 (258),
  • WM_SYSKEYDOWN es 0x104 (260),
  • WM_SYSKEYUP es 0x105 (261).

En cuanto a tu pregunta sobre KeyPress, es cierto que las claves no de caracteres tales como las teclas de flecha no generan WM_CHAR mensajes internamente, pero sí generan WM_KEYDOWN, y ese mensaje se envía también varias veces para la entrada repetida.

También tenga en cuenta que no estoy seguro de ProcessCmdKey() es el método correcto para lograr lo que desea. La documentación describe que solo se trata de main menu command keys and MDI accelerators, que puede ser solo un subconjunto de las claves que desea capturar. Es posible que desee sobrescribir ProcessKeyPreview() en su lugar, que maneja todos los mensajes de teclado recibidos por controles secundarios.

40

Anulación de ProcessCmdKey en su formulario está explícitamente diseñado para permitirle implementar el manejo personalizado de teclas abreviadas más allá del manejo mnemotécnico incorporado en botones y elementos de menú.

Solo se llama a un evento de desactivación de tecla, antes de el control con el foco recibe el evento KeyDown e independientemente del control del cliente que tenga el foco. Por lo tanto, no está asociado con KeyUp y no con KeyPress. Devuelve verdadero desde su anulación cuando reconoce la clave, después de ejecutar la función de acceso directo. Esto evita que la clave se siga procesando, no generará ningún evento KeyDown/Press/Up.

Es muy raro utilizar el msg argumento del método, el valor MSG.MSG siempre será solamente WM_KEYDOWN o WM_SYSKEYDOWN con este último mensaje que se produce cuando el usuario mantiene pulsada la tecla Alt. Lo cual no te importa, ya que siempre puedes obtenerlo desde el argumento keyData. De esta manera:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
     if (keyData == (Keys.Alt | Keys.F)) { 
      // Alt+F pressed 
      doSomething(); 
      return true; 
     } 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 

Los otros modificadores es posible que desee comprobar con el | operador como se usa aquí son Teclas.Shift y Keys.Control. Entonces (Keys.Shift | Keys.Control | Keys.F1) busca Ctrl + Shift + F1. Usted puede interpretar los datos del mensaje cuando desea hacer algo inusual como comprobar si se repiten las teclas. Compruebe los documentos de MSDN para la notificación WM_KEYDOWN. El valor msg.LParam contiene un montón de información sobre el trazo de la tecla.

Tenga en cuenta que solo obtiene teclas virtuales en este método. Keys.F es la tecla F en el diseño del teclado en inglés, pero no necesariamente la misma letra para la tecla en la misma ubicación en el diseño del usuario. Favorece las teclas de función para evitar un dolor de cabeza de documentación.

La repetición de teclas es una función del controlador del teclado y no está limitada a las teclas de escritura. La flecha y las teclas de función ciertamente se repetirán cuando se mantengan presionadas. Desea ignorar KeyPress en este escenario. Pero si asigna una tecla de método abreviado para una tecla que también es una tecla de escritura (como Claves.F), entonces quiere siempre y también busca una tecla de modificación para no romper controles como TextBox.

Por último, pero no menos importante, no se olvide de la compatibilidad incorporada para mnemotécnicos en los controles de botones y elementos de menú. Escribir su propiedad Text como &OK produce un acceso directo autodocumentado sin necesidad de ningún código. Operado por el usuario, en este ejemplo, escribiendo Alt + O.

Cuestiones relacionadas