Можете ли вы объяснить, что делает каждая строка функции C ++? Это посылает нажатия клавиш, но я смущен тем, как - PullRequest
0 голосов
/ 01 января 2012

Я делал программу для отправки нажатий клавиш в другое окно, и у меня все это заработало, но мне пришлось выйти в интернет и найти функцию для выполнения части нажатия клавиш. Это работает, но я понятия не имею, что он на самом деле делает. Может кто-нибудь прокомментировать каждую строку этой функции, объясняя, что она делает?

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, похоже, не имеет значения при нажатии клавиш.

1 Ответ

4 голосов
/ 01 января 2012

Ваша функция GenerateKey использует внутреннюю функцию SendInput из Win32 API, которая синтезирует ввод с клавиатуры.

Вы можете найти всю необходимую информацию, чтобы понять, как работает эта функция и как ее вызывать, прочитав документацию MSDN для этой функции .

Параметр vk представляет собой код виртуальной клавиши , в списке здесь .

Если параметр bExtended равен TRUE, то устанавливается флаг KEYEVENTF_EXTENDEDKEY, что в соответствии с документацией означает, что «коду сканирования предшествовал байт префикса со значением 0xE0 (224) ".

...