Однажды я использовал 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 , чтобы получить код сканирования из кода виртуальной клавиши.