void WriteChar(char c)
{
INPUT input = {0};
input.type = INPUT_KEYBOARD;
input.ki.wVk= VkKeyScanEx(c, GetKeyboardLayout(0) ) ;
SendInput(1,&input, sizeof(INPUT));
}
VkKeyScanEx возвращает различные коды клавиши для '/' и'?' (тот же ключ), однако при попытке использовать этот метод для записи сообщения, содержащего'?', только запишет это '/'. Я не знаю то, что продолжается. То же самое происходит с''; и ':'.
Я частично не понимаю коды клавиши и скэн-коды. Большинство символов имеет код виртуальной клавиши, однако я не могу найти что-то подобным для вопросительных знаков. Они должны существовать, но не перечислены?
Попробуйте сделать это так. Если вы сделаете это с помощью 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 .
В строке 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
требует подсчета байтов.
У меня была та же проблема, и это сводило меня с ума! Я пытался предварительно загрузить изображения, проверенные версии на все и т.д. безрезультатно.. Единственное, что, казалось, исправило это - установить ширину и высоту на каждой картине на странице, а не в 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 разные коды сканирования на основе другой клавиши, в то время как другие в других случаях две клавиши могут возвращать тот же код сканирования.