Можете ли вы объяснить, что делает каждая строка функции C++? Это посылает нажатия клавиш, но я смущен тем, как
Я делал программу для отправки нажатий клавиш в другое окно, и у меня все это заработало, но мне пришлось выйти в интернет и найти функцию для выполнения самой части нажатия клавиш. Это работает, но я понятия не имею, что он на самом деле делает. Может кто-нибудь прокомментировать каждую строку этой функции, объясняя, что она делает?
void GenerateKey(int vk, BOOL bExtended) {
KEYBDINPUT kb = {0};
INPUT Input = {0};
/* Generate a "key down" */
if (bExtended) { kb.dwFlags = KEYEVENTF_EXTENDEDKEY; }
kb.wVk = vk;
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
SendInput(1, &Input, sizeof(Input));
/* Generate a "key up" */
ZeroMemory(&kb, sizeof(KEYBDINPUT));
ZeroMemory(&Input, sizeof(INPUT));
kb.dwFlags = KEYEVENTF_KEYUP;
if (bExtended) { kb.dwFlags |= KEYEVENTF_EXTENDEDKEY; }
kb.wVk = vk;
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
SendInput(1, &Input, sizeof(Input));
return;
}
Вот пример обращения к нему:
GenerateKey('C', FALSE); // Sends keystroke 'c'
Это посылает нажатие клавиши "с".
Эта функция работает только с заглавными буквами и, кажется, работает только с определенными шестнадцатеричными кодами. Например, чтобы отправить возврат каретки (введите ключ), вот вызов:
GenerateKey(0x0D, FALSE); // Sends carriage return
Однако, если я попытаюсь отправить вопросительный знак (hex 0x3F) с любым из этих вызовов, ничего не произойдет:
GenerateKey(0x3F, FALSE); // Nothing happens
GenerateKey('?', FALSE); // Nothing happens
Кто-нибудь может понять, почему это не сработает?
Кроме того, кто-то может объяснить, для чего второй аргумент, BOOL bExtended, для чего? Переключение между TRUE и FALSE, похоже, не имеет значения при нажатии клавиш.
1 ответ
Ваш GenerateKey
функция делает внутреннее использование SendInput
функция из Win32 API, которая синтезирует ввод с клавиатуры.
Вы можете найти всю необходимую информацию, чтобы понять, как работает эта функция и как ее вызывать, прочитав документацию MSDN для этой функции.
vk
Параметр представляет собой код виртуальной клавиши, указанный здесь.
Если bExtended
параметр TRUE
тогда KEYEVENTF_EXTENDEDKEY
установлен флаг, что в соответствии с документацией означает, что "коду сканирования предшествовал байт префикса со значением 0xE0 (224)".