winapi - solucionado - SendInput() para teclado, solo mayúsculas
mi teclado solo escribe en mayusculas mac (1)
El problema fue con
Input.mi.dwFlags
debería ser
Input.ki.dwFlags
gracias a rodrigo
Otra forma es usar el indicador KEYEVENTF_SCANCODE. Luego tenemos que escanear nuestro char usando VkKeyScan () - http://msdn.microsoft.com/en-us/library/windows/desktop/ms646329(v=vs.85).aspx , que nos da el código de clave virtual en bajo byte y estado (shift, ctrl etc.) en byte alto.
Debido al uso de códigos de exploración, tenemos que mapear nuestro código virtual para escanear código utilizando MapVirtualKey () con valor MAPVK_VK_TO_VSC, MSDN dice:
uCode es un código de clave virtual y se traduce en un código de exploración. Si se trata de un código de clave virtual que no distingue entre las teclas izquierda y derecha, se devuelve el código de exploración de la izquierda. Si no hay traducción, la función devuelve 0.
y luego pasarlo al campo wScan de la estructura Input.ki, porque según MSDN si usamos códigos de exploración, ignora wVk y usa wScan, MSDN dice:
Si se especifica, wScan identifica la clave y wVk se ignora.
Por lo tanto, el código puede verse más o menos así:
INPUT Event = { 0 };
const SHORT key = VkKeyScan(''a'');
const UINT mappedKey = MapVirtualKey( LOBYTE( key ), 0 );
// Press shift key
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = MapVirtualKey( VK_LSHIFT, 0 );
SendInput( 1, &Event, sizeof( Event ) );
// upper case ''A'' (press down)
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = mappedKey;
SendInput( 1, &Event, sizeof( Event ) );
// release ''A''
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
Event.ki.wScan = mappedKey;
SendInput( 1, &Event, sizeof( Event ) );
// Release shift key
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
Event.ki.wScan = MapVirtualKey( VK_LSHIFT, 0 );
SendInput( 1, &Event, sizeof( Event ) );
const SHORT key1 = VkKeyScan(''a'');
const UINT mappedKey1 = MapVirtualKey( LOBYTE( key1 ), 0 );
// lower case ''a'' (press down)
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = mappedKey1;
SendInput( 1, &Event, sizeof( Event ) );
// release ''a''
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = mappedKey1;
SendInput( 1, &Event, sizeof( Event ) );
Si he dicho algo mal, por favor corrígeme.
Bastante gracioso. Acabo de preguntar hace unos minutos aquí SendInput () para el teclado, solo minúsculas , cómo enviar letras en mayúsculas. La solución fue enviar turno antes de la carta. Pero después de encender el turno no puedo apagarlo ...
Estoy intentando con la bandera KEYEVENTF_KEYUP así:
INPUT Input = { 0 };
Input.type = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk = VK_LSHIFT;
SendInput( 1, &Input, sizeof( INPUT ) );
Input.type = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk = ''A'';
SendInput( 1, &Input, sizeof( INPUT ) );
Input.type = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk = VK_LSHIFT;
SendInput( 1, &Input, sizeof( INPUT ) );
Input.type = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk = ''A'';
SendInput( 1, &Input, sizeof( INPUT ) );
pero parece no funcionar en absoluto. Siempre envía AA.
Gracias.