2010-01-30 12 views
6
void WriteChar(char c) 
{ 
    INPUT input = {0}; 
    input.type = INPUT_KEYBOARD; 
    input.ki.wVk= VkKeyScanEx(c, GetKeyboardLayout(0)) ; 
    SendInput(1,&input, sizeof(INPUT)); 
} 

VkKeyScanEx devuelve diferentes códigos de tecla para '/' y '?' (Misma tecla); sin embargo, si intenta utilizar este método para escribir un mensaje que contenga '?', Solo escribirá '/'. No sé lo que está pasando. Lo mismo ocurre con ';' y ':'.SendInput() no está "enviando" los caracteres desplazados correctos?

En parte, no entiendo los códigos de tecla y códigos de escaneo. La mayoría de los personajes tienen un código de clave virtual, sin embargo, no puedo encontrar algo similar para los signos de interrogación. Deben existir, pero no están en la lista?

Respuesta

1

Trate de hacerlo así. Si lo hace usando KEYEVENTF_UNICODE, la plataforma de host deberá ser al menos Windows 2000 o XP.

INPUT input[ 2 ]; 

input[ 0 ].type = INPUT_KEYBOARD; 
input[ 0 ].ki.wVk = 0; 
input[ 0 ].ki.wScan = c; 
input[ 0 ].ki.dwFlags = KEYEVENTF_UNICODE; 
input[ 0 ].ki.time = 0; 
input[ 0 ].ki.dwExtraInfo = GetMessageExtraInfo(); 

input[ 1 ].type = INPUT_KEYBOARD; 
input[ 1 ].ki.wVk = 0; 
input[ 1 ].ki.wScan = c; 
input[ 1 ].ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP; 
input[ 1 ].ki.time = 0; 
input[ 1 ].ki.dwExtraInfo = GetMessageExtraInfo(); 

SendInput((UINT)2, input, sizeof(*input)); 

A juzgar por el hecho de que usted no llena su estructura de entrada correctamente y dejó a algunos miembros requeridos sin inicializar, yo supongo que no has visto la documentación de este. Consulte SendInput, INPUT y KEYBDINPUT.

+0

A menudo veo ejemplos de '' 'input.ki.dwExtraInfo''' establecido en 0. ¿Debería ser' '' input [0] .ki.dwExtraInfo = GetMessageExtraInfo(); '' '? – camelCase

+0

@rasteve, ¡sinceramente no lo sé!Probablemente lo hice porque [la documentación de 'KEYBDINPUT'] (https://msdn.microsoft.com/en-us/library/ms646271 (VS.85) .aspx) dice esto sobre' dwExtraInfo': 'Use el Función GetMessageExtraInfo para obtener esta información. – Sam

+0

Lo leí como usar '' 'GetMessageExtraInfo''' para obtener lo que ingresó en' '' dwExtraInfo''' pero ahora no estoy muy seguro. – camelCase

9

Los códigos de exploración son los identificadores de clave sin procesar devueltos por el teclado. Entonces, un teclado de 101 teclas (en teoría) tendrá 101 códigos de escaneo únicos que puede devolver. (Ver nota al pie)

Los códigos de clave virtual son un conjunto separado de códigos que representan una tecla en un teclado ideal. No importa dónde se encuentre la tecla TAB en un teclado real, y qué código de exploración se usa, el código de la clave virtual siempre es VK_TAB. windows.h define códigos VK_xxx para claves virtuales no imprimibles, para los imprimibles, el código de clave virtual es el mismo que el valor ASCII.

Pero los códigos de teclas virtuales siguen siendo códigos de clave. 'A' y 'a' tienen el mismo código de tecla virtual, por lo que si quieres enviar una 'A' debes enviar una VK_SHIFT hacia abajo, luego 'a' hacia abajo, luego 'a' hacia arriba y luego VK_SHIFT hacia arriba.

VkKeyScanEx() convierte un carácter en una tecla y cambiar consulta del estado de Ver la siguiente cita de esta página http://msdn.microsoft.com/en-us/library/ms646332(VS.85).aspx

Si la función tiene éxito, el byte de menor peso del valor de retorno contiene la tecla virtual el código y el byte de orden superior contiene el estado de cambio, que puede ser una combinación de los siguientes bits de indicador.

Así que no puede simplemente tomar la devolución de VkKeyScanEx(), debe verificar si tiene una tecla de cambio marcada. y enviar la tecla de mayúsculas como una pulsación separada

SHORT vk = VkKeyScanEx(c, ...); 
if (vk & 0x100) // check upper byte for shift flag 
{ 
    // send a shift key down 
} 
if (vk & 0x200) // check for ctrl flag 
{ 
    // send a ctrl key down 
} 
input.ki.wVk = vk & 0xFF; 

// send keyup for each of the keydown 

También hay que enviar un keyup para cada keydown.

Notas al pie:

Este es sólo en teoría, en la práctica los teclados de PC estándar emular un teclado IBM edad que ni siquiera se puede conseguir más, por lo que algunas teclas pueden volver 2 de escaneo de códigos diferentes en función de otra clave, mientras que en otros casos, otras dos teclas pueden devolver el mismo código de exploración.

+0

Hola, gracias por la respuesta. Supuse que no tenía que hacer la tecla para cada keydown porque si probara esto en una ventana de bloc de notas, solo escribiría un solo carácter (mientras que si se mantuviera pulsado y nunca se lanzara, obviamente sería una cadena interminable del personaje). ¿Por qué me equivoco al asumir esto? –

+0

Cuando mantiene presionada una tecla, el teclado en realidad envía la tecla de selección, la tecla de selección, la tecla de selección, la tecla de selección, ... y la tecla para cuando finalmente la suelte. La excepción a esto es CTRL, SHIFT y ALT que no se repiten. –

+0

No creo que sea el teclado mismo el que envíe repetidamente las señales de "selección de teclas". Creo que este comportamiento en realidad es controlado por la computadora. – Sam

Cuestiones relacionadas