【发布时间】:2020-02-08 13:45:46
【问题描述】:
在我的程序中,我想模拟按键。例如我想说 Press(KeyA, 1000),其中第一个参数是 KeyCode,第二个参数是以毫秒为单位的时间。 KeyA 等是 typedef,这些方法非常适合只需按下按钮一次。
void PressKey(INPUT &ip, int keycode, int ms)
{
// Press the key
ip.ki.wVk = keycode; // virtual-key code for the key
ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));
sleep(ms);
// Release the key
ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
SendInput(1, &ip, sizeof(INPUT));
}
int main()
{
// input event
INPUT ip;
INPUT ipMouse;
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0; // hardware scan code for key
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
PressKey(ip, KeyM, 1000);
我认为按下键,然后等到释放它会算作按住按钮按下,但事实并非如此。此外,我不想只说 PressKey(ip, KeyM) 一千次以获得与按住按钮 5 秒相同的输入。现在有人如何让程序模拟更长的输入吗?
【问题讨论】:
-
按键的目标是什么?是您自己的程序还是其他应用程序?它怎么不工作?你 sleep() 的事实会阻止你自己的主循环在那段时间运行。如果它是另一个应用程序,它可能会检查键盘扫描码或读取输入。
-
我自己写了一个主机游戏,我想用不同的 /O 选项编译,然后在 excel 中分析优化。我现在已经完成了所有设置,在 csv 文件中输出 fps 和 cpu 等效果很好。不过,要真正比较优化,我总是需要相同的输入。这就是为什么我需要按住“w”键一段固定的时间,因为我的游戏的移动速度取决于帧之间的时间差。这是有道理的,还是我只是想错了方向。我希望输入是外部程序,所以没有对运动进行硬编码
-
不记录输入。而是记录游戏引擎的状态转换,然后重播这些。
-
录制输入完全没问题(为多个 AAA 游戏做到了)。从主循环重放它是一个好方法。但是,使用 win32 输入注入并不是正确的方法。
-
X-Y 问题:正确的问题是:如何保存输入并重放它们?如何配置我的游戏?以及如何保持游戏逻辑的确定性?