Коды сканирования - это необработанные идентификаторы клавиш, возвращаемые с клавиатуры. Таким образом, клавиатура из 101 клавиши (в теории) будет иметь 101 уникальный код сканирования, который она может вернуть. (см. сноску 1 )
Виртуальные коды клавиш представляют собой отдельный набор кодов, которые представляют собой клавишу на идеализированной клавиатуре. Независимо от того, где на реальной клавиатуре находится клавиша TAB и какой код сканирования используется для нее, код виртуальной клавиши всегда равен 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
Если функция завершается успешно, младший байт возвращаемого значения содержит код виртуальной клавиши, а старший бит содержит состояние сдвига, которое может быть комбинацией следующих битов флага.
Так что вы не можете просто взять возврат из VkKeyScanEx (), вам нужно проверить, не помечен ли он на клавише Shift. и отправьте клавишу Shift как отдельное нажатие
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 разных кода сканирования на основе другой клавиши, в то время как в других случаях два ключа могут возвращать один и тот же код сканирования.