SendInput() для клавиатуры - только строчные буквы

У меня есть следующий код:

INPUT Input = { 0 };
Input.type       = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk   = 'A'; // tried 0x41, ( UCHAR )VkKeyScan( 'A' )
SendInput( 1, &Input, sizeof( INPUT ) );

но он генерирует мне только «а». Как заставить его генерировать верхний регистр?

Спасибо.


person tobi    schedule 11.07.2012    source источник
comment
Вы должны имитировать удерживание клавиши Shift, как если бы вы печатали   -  person InspiredBy    schedule 11.07.2012
comment
Как намекнул Шенаниганц, вы имитируете нажатие клавиши. Есть ли на вашей клавиатуре клавиша A в верхнем регистре и клавиша в нижнем регистре?   -  person TheZ    schedule 11.07.2012
comment
Тип INPUT содержит объединение nameelss, поэтому вам действительно не следует присваивать mi и ki членам одной и той же переменной.   -  person rodrigo    schedule 11.07.2012
comment
о боже! Была ошибка. Вы должны были ответить на вопрос и получить все эти голоса! Спасибо   -  person tobi    schedule 11.07.2012
comment
@tobi: Положительные голоса - это хорошо, но эта ошибка вряд ли была причиной ваших проблем, поэтому технически это не должно быть ответом.   -  person rodrigo    schedule 12.07.2012
comment
@rodrigo Я перепутал эту тему с другой моей xD "> stackoverflow.com/questions/11438677/   -  person tobi    schedule 12.07.2012


Ответы (1)


РЕДАКТИРОВАТЬ: некоторые модификации в соответствии с ответом Родриго в комментариях.

INPUT Input = { 0 };
// shift key down
Input.type       = INPUT_KEYBOARD;
Input.ki.wVk   = VK_LSHIFT; 
SendInput( 1, &Input, sizeof( INPUT ) );

// 'a' key down
Input.type       = INPUT_KEYBOARD;
Input.ki.wVk   = 'A';
SendInput( 1, &Input, sizeof( INPUT ) );

// 'a' key release
Input.type       = INPUT_KEYBOARD;
Input.ki.dwFlags = KEYEVENTF_KEYUP;
Input.ki.wVk   = 'A';
SendInput( 1, &Input, sizeof( INPUT ) );

// shift key release
Input.type       = INPUT_KEYBOARD;
Input.ki.dwFlags = KEYEVENTF_KEYUP;
Input.ki.wVk   = VK_LSHIFT; 
SendInput( 1, &Input, sizeof( INPUT ) );

РЕДАКТИРОВАТЬ: вот еще один код с примером отключения заглавных букв/сдвига после отправки письма:

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'
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = mappedKey;
SendInput( 1, &Event, sizeof( Event ) );

// release upper case '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'
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = mappedKey1;
SendInput( 1, &Event, sizeof( Event ) );

// release lower case 'a'
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
Event.ki.wScan = mappedKey1;
SendInput( 1, &Event, sizeof( Event ) );

объяснение здесь (надеюсь, объяснение правильное): SendInput() только для клавиатуры верхний регистр

person tobi    schedule 11.07.2012
comment
Действительно, кто-то может. Хороший призыв оставить вопрос (и ответ) здесь. - person 0xC0000022L; 11.07.2012