Я делал программу для отправки нажатий клавиш в другое окно, и у меня все это заработало, но мне пришлось выйти в интернет и найти функцию для выполнения части нажатия клавиш. Это работает, но я понятия не имею, что он на самом деле делает. Может кто-нибудь прокомментировать каждую строку этой функции, объясняя, что она делает?
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'
Это отправляет нажатие клавиши 'c'.
Эта функция работает только с заглавными буквами и, кажется, работает только с определенными шестнадцатеричными кодами. Например, для отправки возврата каретки (введите ключ), вот звонок:
GenerateKey(0x0D, FALSE); // Sends carriage return
Однако, если я попытаюсь отправить вопросительный знак (hex 0x3F) с любым из этих вызовов, ничего не произойдет:
GenerateKey(0x3F, FALSE); // Nothing happens
GenerateKey('?', FALSE); // Nothing happens
Кто-нибудь может понять, почему это не сработает?
Кроме того, кто-то может объяснить, для чего второй аргумент, BOOL bExtended, для чего? Переключение между TRUE и FALSE, похоже, не имеет значения при нажатии клавиш.