Hay varias formas de atrapar el mouse o el teclado en Windows. Así que probé algunos de ellos, pero cada uno de ellos tiene algunas ventajas y desventajas. Quiero preguntarte: ¿Qué método utilizo?
He intentado estos:
WM_KEYDOWN / WM_KEYUP: la principal desventaja es que no puedo distinguir entre las teclas izquierda y derecha como ALT, CONTROL o SHIFT.
GetKeyboardState: esto resuelve el problema del primer método, pero hay uno nuevo. Cuando obtengo que la tecla ALT-derecha está presionada, también veo que la tecla Control-izquierda está presionada. Este comportamiento ocurre solo cuando se usa la distribución del teclado localizado (checo - CS).
WM_INPUT (entrada sin formato): este método tampoco distingue las teclas izquierda y derecha (si puedo recordar) y, para el movimiento del mouse, a veces genera mensajes con valores cero delta de la posición del mouse.
¿Hay alguna razón por la que no puedes combinarlos? Por ejemplo, use WM_KEYDOWN para detectar la presión de una tecla Ctrl / Alt / Shift, luego, dentro de esa llamada, use GetKeyboardState () para distinguir de izquierda a derecha.
fuente
WM_INPUT es bueno. Yo creo que se puede distinguir las teclas izquierda / derecha utilizando la estructura RAWKEYBOARD . La parte difícil puede ser descubrir cómo lidiar con los identificadores de clave (es decir, códigos de exploración), pero no puedo decirlo, ya que nunca he tratado de usar esto para la entrada del teclado. WM_KEYDOWN es muy fácil :)
Sin embargo, he usado WM_INPUT para la entrada del mouse. Es de muy bajo nivel. No tiene aceleración aplicada, lo cual es muy bueno (IMO). WM_INPUT solía ser la única forma de aprovechar el movimiento del mouse de alta resolución, pero no estoy seguro de si ese es el caso. Vea este artículo de MSDN de 2006 .
DirectInput para mouse / teclado está explícitamente desaconsejado por Microsoft. Consulte el artículo de MSDN vinculado anteriormente. Si necesita un joystick, XInput es probablemente el camino a seguir.
EDITAR: Mi información sobre esto puede estar demasiado fechada.
fuente
En realidad, sepa L / R Ctrl / Alt cuando capture WM_KEYDOWN / WM_KEYUP, puede hacerlo. Fácil, no lo es, pero el código que uso, aquí puedes tener, hmm hmm.
Espero que esto todavía funcione, lo hago.
fuente
Puede probar la API DirectInput , o más recientemente, la API XInput .
fuente