最佳答案
我曾经使用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从虚拟键码中获取扫描码。
关于winapi - 如何通过程序发送硬件级键盘输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58028168/