keybd_event KEYEVENTF_EXTENDEDKEY explicación requerida

En la documentación dice:

KEYEVENTF_EXTENDEDKEY (0x0001): Si se especifica, el código de escaneo fue precedido por un byte de prefijo que tiene el valor 0xE0 (224).

puede alguien explicarme que significa esto?

¿Cuál es la diferencia entre esto?

keybd_event(RIGHT, 0, 0, 0); keybd_event(RIGHT, 0, 2, 0); 

y esto:

 keybd_event(RIGHT, 0, 1 | 0, 0); keybd_event(RIGHT, 0, 1 | 2, 0); 

¿Porque cuando ejecuto este código no puedo ver ninguna diferencia?

Además, ¿para qué sirve “byte bScan”? En la descripción es: Un código de escaneo de hardware para la clave. ¿Qué significa eso?

La explicación simple (e incompleta) es que KEYEVENTF_EXTENDEDKEY significa “esta pulsación es del teclado numérico”

Dado que la mayoría de los progtwigs se comportan de la misma manera si presiona ‘1’ sobre la tecla ‘q’ como lo hacen cuando presiona ‘1’ en el teclado numérico (que es una tecla extendida), normalmente no esperaría ver ninguna diferencia cuando establece esta bandera al simular la entrada del teclado.

Los progtwigs que prestan atención a la ubicación de una clave generalmente responderán a esta bandera.

El valor de bScan es un código de hardware en bruto. Para una explicación de scancodes mira aquí http://en.wikipedia.org/wiki/Scancode . Al igual que la bandera de clave extendida, la mayoría de los progtwigs no prestan atención a los scancodes. Los valores están ahí en caso de que el progtwig quiera tratar el teclado como un grupo de botones.

Es un detalle de implementación antiguo de distribuciones de teclado en la PC original de IBM. Así se veía el teclado en 1981:

introduzca la descripción de la imagen aquí

No se parece mucho a los teclados de hoy. Esto evolucionó, se agregaron teclas adicionales como las teclas de cursor dedicadas y las teclas Ctrl y Alt a la derecha de la barra espaciadora. Para mantenerlo compatible con el software existente que lee directamente el teclado (un delito muy común en aquellos días), el controlador del teclado informa esas teclas extendidas con el mismo código de escaneo pero con un byte especial adicional delante de él. Así que las teclas Ctrl y Alt del lado derecho funcionaron de la misma manera que las teclas izquierdas, si un progtwig se preocupa por la distinción, podría detectar la diferencia con el byte de prefijo. 0xE0 es ese prefijo.

A muchos progtwigs no les importa qué tecla en particular presionó, solo usan el código de la tecla virtual y no les importa si es una tecla extendida. Al igual que los viejos progtwigs de MS-Dos no lo hicieron. Es por eso que no ves una diferencia. Y como no especificó el código de escaneo, no puede hacer una diferencia. Un documento detallado de Microsoft que describe los códigos de escaneo del teclado está disponible aquí .

Ambas respuestas aquí están equivocadas. No entiendo por qué la gente vota por respuestas incorrectas.

Ambas respuestas sugieren que la bandera es irrelevante. Esto está completamente mal. Y la bandera no tiene NADA que ver con el teclado.

La respuesta correcta es que solo hay códigos de escaneo de 01 a 7F, pero las claves virtuales varían de 01 a FF.

Así que a medida que los teclados crecían, se hizo necesario que algunos códigos de escaneo tuvieran doble asignación. Por ejemplo, en mi teclado, el código de escaneo 0x45 se asigna a la tecla de Bloqueo numérico Y a la tecla de pausa.

Para distinguirlos, el keyborard envía el indicador de clave extendida para la clave NumLock pero no para la clave de pausa.

Hay varias otras teclas que tienen doble asignación como, por ejemplo, todas las teclas de medios.

Ejecute Spy ++ que viene con Visual Studio Tools y filtre solo WM_KEYDOWN y habilite “Parámetros de mensaje decodificados” luego presione algunas teclas en un editor de texto.

Spy ++ le mostrará para qué teclas está configurada la bandera y para qué teclas no está configurada.

Aquí la salida de Spy ++:

 P WM_KEYDOWN nVirtKey:VK_NUMLOCK cRepeat:1 ScanCode:45 fExtended:1 fAltDown:0 fRepeat:0 fUp:0 P WM_KEYDOWN nVirtKey:VK_PAUSE cRepeat:1 ScanCode:45 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 

Otro ejemplo es el código de escaneo 2E que se asigna a la letra “C” y a VK_VOLUME_DOWN en mi teclado.

Debe progtwigrlo exactamente de la misma manera, de lo contrario, la inyección del teclado con keybd_event() fallará porque se golpea otra tecla que la que usted deseaba.

NO confíe en MapVirtualKeyEx(MAPVK_VK_TO_VSC_EX) (> = Vista) porque no devuelve el indicador extendido para algunas claves, aunque son claves extendidas, como VK_LEFT, por ejemplo. Otro error en esta función es que devuelve el indicador extendido (E1) para la clave VK_PAUSE aunque esta clave no está extendida.