Как отправить аппаратный уровень ввода клавиатуры программой? - PullRequest
0 голосов
/ 20 сентября 2019

Я использовал keybd_event для ввода с клавиатуры с помощью командной строки.Тем не менее, вам нужно что-то, что может посылать ввод аппаратного уровня, как настоящая клавиатура.

Есть ли что-то, что подходит для моих целей?

Я использую Windows в качестве операционной системы.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

keybd_event() устарела, вместо этого используйте SendInput().

SendInput() отправляет свои смоделированные события в ту же очередь, в которую драйвер оборудования отправляет свои события, как показано надиаграмма ниже из блога Рэймонда Чена:

Когда что-то добавляется в очередь, требуется время, чтобы оно вышло впереди очереди

image

0 голосов
/ 20 сентября 2019

Однажды я использовал SendInput для управления игровым персонажем.Игра (ледяная башня?) Использовала систему ввода DirectX (я думаю?) И каким-то образом игнорировала вызовы keybd_event, но этот метод работал.Я не знаю, как близко к аппаратному обеспечению вы должны быть, но сделал это для меня.Я использовал виртуальные коды клавиш, но превратил их в коды сканирования для этого ответа.

UINT PressKeyScan(WORD scanCode)
{
    INPUT input[1] = {0};
    input[0].type = INPUT_KEYBOARD;
    input[0].ki.wVk = NULL;
    input[0].ki.wScan = scanCode;
    input[0].ki.dwFlags = KEYEVENTF_SCANCODE;

    UINT ret = SendInput(1, input, sizeof(INPUT));

    return ret;
}

UINT ReleaseKeyScan(WORD scanCode)
{
    INPUT input[1] = {0};
    input[0].type = INPUT_KEYBOARD;
    input[0].ki.wVk = NULL;
    input[0].ki.wScan = scanCode;
    input[0].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;


    UINT ret = SendInput(1, input, sizeof(INPUT));

    return ret;
}

Чтобы смоделировать нажатие и отпускание, вы используете их последовательно (или вы можете создать отдельную функцию для нажатия и отпускания, которая использует одинаковую структуру INPUT ).

WORD scanCodeSpace = 0x39;
PressKeyScan(scanCodeSpace);
ReleaseKeyScan(scanCodeSpace)

Вы можете использовать MapVirtualKeyA , чтобы получить код сканирования из кода виртуальной клавиши.

...