2011-11-17 19 views
16

Así que en el programa de edición de texto en el que he estado trabajando, he usado WM_CHAR para procesar la entrada desde el teclado. Sin embargo, descubrí que algunos de los mensajes de caracteres no se graban. Por ejemplo, si uso [shift] + tecla numérica para escribir un símbolo como% o &, algunos volverán a grabarse mientras que otros como [shift] +9 (que da como resultado ')') no se grabarán. Entonces, me pregunto si debería usar el par WM_KEYDOWN/WMKEYUP para manejar la entrada del teclado. Una vez escribí un keylogger en ensamblador (en realidad, era solo un tutorial que estaba probando) y había usado WM_KEYDOWN/WM_KEYUP pares y funcionó bastante bien. Entonces, ¿debo pasar a esto, o es algo inusual que está sucediendo con mi programa?Manejo de entrada de teclado en win32, WM_CHAR o WM_KEYDOWN/WM_KEYUP?

Gracias,

Devjeet

+1

Creo que los mensajes WM_CHAR se generan automáticamente por el procedimiento de ventana predeterminado para WM_KEYDOWN. –

+0

Dependiendo de si esto es sólo para uso personal o no, también es posible que desee admitir IME para que los usuarios puedan ingresar a idiomas como japonés, chino y coreano. En lugar de reinventar la rueda de scrach, podría valer la pena echar un vistazo al componente de edición de código de código abierto scintilla.org y ver si satisface sus necesidades, o ver cómo maneja estos problemas. Tenga en cuenta que incluso el scintilla no maneja problemas como el texto bidireccional, como el hebreo/árabe. Manejar correctamente Unicode también tiene algunos problemas divertidos, ya que un personaje visualizable en la pantalla puede asignarse a uno o más WCHAR. – BrendanMcK

+0

Gracias por el comentario, resolví este error. Aparentemente, Windows funciona de maneras realmente extrañas. Había puesto ciertas condiciones para manejar las teclas de flecha. Usé SPY ++ y luego analicé todo. Luego me reduje a esas condiciones (en una declaración de cambio) y luego las comento. Funciona. Parece que cuando presiona [shift] +9, Windows envía un VK_LEFT en el wParam del mensaje WM_CHAR. – devjeetroy

Respuesta

47

Esto es realmente una larga respuesta a su comentario anterior, pero poniéndolo en una respuesta porque es demasiado largo para un comentario :)

El tema central para entender aquí es que las claves y los personajes no son exactamente lo mismo. Algunas (pero no todas) claves generan caracteres; algunas teclas generan diferentes caracteres dependiendo del turno u otro estado del teclado. Y para implementar un editor, debe manejar tanto la entrada de texto como la entrada de teclado no textual, como las teclas de flecha. Ahora la versión larga, eligiendo de lo que parece ser una suposición incorrecta:

Aparentemente, Windows funciona de maneras realmente extrañas. [...] Parece que cuando presiona [shift] +9, Windows envía un VK_LEFT en el wParam del mensaje WM_CHAR

Parece que podría estar mezclando dos cosas aquí. Lo que ocurre con WM_CHAR es que le da códigos de caracteres para los caracteres de texto: por lo que si alguien presiona la tecla 9, obtendrá '9'. Si alguien presiona SHIFT + 9, Windows tomará en cuenta el estado de cambio, y obtendrá '(' (si usa el teclado de EE. UU.). Pero nunca obtendrá un WM_CHAR para las teclas de flecha, HOME, END, y así sucesivamente, ya que no son caracteres de texto. WM_KEYDOWN, por otro lado, no se trata en caracteres, sino en códigos VK_, por lo que presionar 9 le da VK_9 independientemente del estado de cambio, y la flecha izquierda le da VK_LEFT - de nuevo según el estado del cambio.

Lo que pasa es que WM_CHAR y WM_KEYDOWN le dan dos partes a la imagen de entrada general, pero debe manejar ambas para obtener una imagen completa. Y debe tener en cuenta que el wParam es algo muy diferente en ambos casos Es un código de carácter para WM_CHAR, pero un código VK_ para WM_KEYDOWN. No mezcle los dos.

Y a m Haga las cosas más confusas, Los valores VK_ comparten los mismos valores que los caracteres válidos. Abre WinUser.h (está en el incluir dir bajo el directorio de instalación del compilador), y buscar VK_LEFT:

#define VK_LEFT   0x25 

Resulta que 0x25 también es el código para el carácter '%' (ver cualquier tabla ASCII/Unicode para más detalles) . Entonces, si WM_CHAR obtiene 0x25, significa que se presionó shift-5 (asumiendo el teclado de los EE. UU.) Para crear un '%'; pero si WM_KEYDOWN obtiene 0x25, significa que se presionó la flecha izquierda (VK_LEFT). Y para agregar un poco más de confusión, los códigos de clave virtual para las teclas AZ y 0-9 son los mismos que los caracteres 'A' - 'Z' y '0' - '9', lo que hace que parezca chars y VK_'s son intercambiables. Pero no lo son: el código para la minúscula 'a', 0x61, es VK_NUMPAD1. (Por lo tanto, obtener 0x61 en WM_CHAR significa 'a', obtenerlo en WM_KEYDOWN significa NUMPAD1. Y si un usuario pulsa la tecla 'A' en estado no desplazado, lo que realmente obtiene es primero un VK_A (el mismo valor que 'A') . en WM_KEYDOWN, lo que se traduce a WM_CHAR de 'a')

Así atar todo esto, la manera típica para manejar el teclado es utilizar todas las características siguientes: Pruebas

  • uso WM_CHAR manejar entrada: claves de texto reales. wParam es el personaje que desea agregar a su cadena, o hacer cualquier otra cosa con. Esto hace todo el procesamiento de turnos para usted.

  • Use WM_KEYDOWN para manejar las teclas 'meta', como las teclas de flecha, inicio, final, página arriba, y así sucesivamente. Pase todos los valores A-Z/0-9, el manejo predeterminado los convertirá en WM_CHAR que puede manejar en su controlador WM_CHAR. (También puede manejar las teclas del teclado numérico aquí si desea usarlas para una funcionalidad especial, de lo contrario 'desaparecerán' para terminar como WM_CHAR numéricos, dependiendo del estado de bloqueo numérico. Windows se encarga de esto, del mismo modo que maneja el estado de cambio para el teclas alfabéticas.)

  • Si desea manejar ALT- combos explícitamente (en lugar de utilizar una tabla de aceleradores), los obtendrá a través de WM_SYSKEYDOWN.

Creo que hay algunas claves que podrían aparecer en ambos - Introduzca podrían presentarse tanto como un WM_KEYDOWN de VK_RETURN y tan bien \ r o \ n WM_CHAR - pero mi preferencia sería para manejarlo en WM_KEYDOWN , para seguir editando el manejo de las teclas por separado de las teclas de texto.

+1

Gracias hombre! eso explicaba todo. Estaba un poco confundido sobre por qué VK_LEFT era lo mismo que a). Ahora tu respuesta deja todo en claro. ¡Muchas gracias hombre! respuesta muy elaborada! – devjeetroy

+0

Respuesta muy clara, tenía esta misma pregunta y ahora esto tiene mucho más sentido. – abelito

+0

De acuerdo, muy buena respuesta. – Chungzuwalla

4

Spy++ le mostrará los mensajes que se envían a una ventana, por lo que puede experimentar y ver qué mensajes son apropiados para su aplicación.

Si tiene instalado Visual Studio, debe estar en su menú Inicio, en Programas -> Microsoft Visual Studio -> Herramientas de Visual Studio -> Spy ++.

Cuestiones relacionadas