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.
A menudo veo ejemplos de '' 'input.ki.dwExtraInfo''' establecido en 0. ¿Debería ser' '' input [0] .ki.dwExtraInfo = GetMessageExtraInfo(); '' '? – camelCase
@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
Lo leí como usar '' 'GetMessageExtraInfo''' para obtener lo que ingresó en' '' dwExtraInfo''' pero ahora no estoy muy seguro. – camelCase