SendInput () разве “отправка” не является корректными смещенными символами?

void WriteChar(char c)
{
    INPUT input = {0};
    input.type = INPUT_KEYBOARD;
    input.ki.wVk= VkKeyScanEx(c, GetKeyboardLayout(0) ) ;   
    SendInput(1,&input, sizeof(INPUT));
}

VkKeyScanEx возвращает различные коды клавиши для '/' и'?' (тот же ключ), однако при попытке использовать этот метод для записи сообщения, содержащего'?', только запишет это '/'. Я не знаю то, что продолжается. То же самое происходит с''; и ':'.

Я частично не понимаю коды клавиши и скэн-коды. Большинство символов имеет код виртуальной клавиши, однако я не могу найти что-то подобным для вопросительных знаков. Они должны существовать, но не перечислены?

7
задан Alex Gramatikov 30 January 2010 в 07:08
поделиться

2 ответа

Попробуйте сделать это так. Если вы сделаете это с помощью keyEventf_Unicode , хост-платформа должна быть хотя бы Windows 2000 или 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 ) );

Судя по тому, что вы правильно не заполняли свою входную структуру и оставили некоторые необходимые члены неинициализированные, я бы предположил, что вы не видели документацию для этого. См. SENDINPUT , вход и Keybdinput .

1
ответ дан 7 December 2019 в 01:21
поделиться

В строке 104 есть две ошибки,

strncpy(inputCopy, input, strlen(input)*sizeof(char));

Необходимо задать комнату strncpy для завершающего null, поэтому он должен быть strlen (вход) + 1 strncpy не guranteed, чтобы оставить выходной буфер нулевым завершенным, что кажется ошибкой в strncpy, но это не так. Он был разработан таким образом. Strncpy был разработан для того, чтобы скопировать последовательность в выходной буфер, а затем заполнить оставшуюся часть буфера нулями ., Он на самом деле не разработан как 'safe strcpy'

Ваша другая ошибка в том, что Strncpy принимает символ count не байт count, поэтому неправильно умножать на sizeof ( . Так как sizeof (char) = = 1, это на самом деле не вызывает проблем, но все равно его неправильный замысел.

Правильно было умножить на sizeof (char) в malloc в строке 99 так как malloc требует подсчета байтов.

-121--2695313-

У меня была та же проблема, и это сводило меня с ума! Я пытался предварительно загрузить изображения, проверенные версии на все и т.д. безрезультатно.. Единственное, что, казалось, исправило это - установить ширину и высоту на каждой картине на странице, а не в css.

-121--3853831-

Коды сканирования - это идентификаторы необработанных клавиш, возвращаемые с клавиатуры. Таким образом, клавиатура 101 клавиши (теоретически) будет иметь 101 уникальный код сканирования, который она может вернуть. (см. сноску 1 )

Коды виртуальных клавиш представляют собой отдельный набор кодов, представляющих клавишу на идеализированной клавиатуре. Независимо от того, где на реальной клавиатуре находится клавиша TAB и какой для нее используется scancode, код виртуальной клавиши всегда VK_TAB. windows.h определяет коды VK_xxx для непечатаемых виртуальных ключей, для печатаемых кодов код виртуального ключа совпадает со значением ASCII.

Но коды виртуальных ключей по-прежнему являются кодами ключей. 'A' и 'a' имеют одинаковый код виртуального ключа, так что если вы хотите отправить 'A' то вы должны отправить VK_SHIFT вниз, затем 'a' вниз, затем 'a' вверх, то VK_SHIFT вверх.

VkKeyScanEx () преобразует символ в ключ сканирования и состояние сдвига См. приведенную ниже цитату с этой страницы http://msdn.microsoft.com/en-us/library/ms646332 (VS.85) .aspx

Если функция выполняется успешно, байт низкого порядка возвращаемого значения содержит код виртуального ключа, а байт высокого порядка содержит состояние сдвига, которое может быть комбинацией

Таким образом, вы не можете просто взять возврат от VkeyScanEx (), вы должны проверить, если он имеет ключ смены помечен. и отправить клавишу сдвига в виде отдельного нажатия клавиши

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

Вы также должны отправить нажатие клавиши для каждого нажатия клавиши.

Сноски:

1 Это только теоретически, на практике стандартные клавиатуры ПК эмулируют старую клавиатуру IBM, которую вы больше не можете получить, поэтому некоторые клавиши могут возвращать 2 разные коды сканирования на основе другой клавиши, в то время как другие в других случаях две клавиши могут возвращать тот же код сканирования.

9
ответ дан 7 December 2019 в 01:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: