以编程方式将键盘输入发送到Windows中的图形应用程序(游戏)

时间:2014-11-18 04:45:05

标签: python c++ windows input automation

我希望能够使用程序/脚本自动将键盘控件发送到非常简单的视频游戏。只有3个按钮需要工作,它们可以是任何3个键盘按钮(可以在游戏中更改键绑定)。控制基本上是左,右,射击。

我尝试过的事情: 的Python:

  • keybd_event
  • SendKeys
  • SendInput

C ++:

  • 使用wVk发送输入
  • SendInput通过KEYEVENTF_SCANCODE标志直接输入十六进制扫描码到wScan
  • SendInput使用MapVirtualKey转换字符为wScan(KEYEVENTF_SCANCODE标志开启)

几乎任何我搜索过这个问题的方式,每个人都指出了上述方法。它们都可以很好地将文本输入到记事本或其他文本输入中(例如,向上箭头在命令提示符下工作正常,从而显示最后一个命令输入)。他们也可以在你将你的名字列入高分榜的区域中将角色发送到游戏中。

我还可以在游戏运行时成功发送F12(这会打开和关闭声音)。这至少表明,在实际的游戏过程中,它正在接收键盘命令并且显然正确地解释它们。

我能做到的只是简单的动作命令(左,右,射击 - 简单游戏真正拥有的唯一命令)。我已尝试使用设置为箭头键的命令(默认)和' a'' d'' w'在游戏中,并与其他应用程序验证这些命令正在被发送,以及(在字母键的情况下)游戏本身内的高分输入屏幕。但它只是在实际游戏中没有注册它们。

我可以使用辅助功能菜单中的屏幕键盘发送击键来玩游戏。如果这样做,似乎必须有某种方法来完成这个看似简单的任务,但我完全失去了,搜索结果充斥着破碎的建议(上面列出的方法)。

任何人都可以指出我可能有用的方向,而不是我已经尝试过的上述事情之一,所有类似于这个问题的回答似乎都暗示了吗?

如果有直接从Python做到这一点的方法,那将是理想的,但如果确实需要,我可以处理其他语言。

快速代码段,例如:

#include <windows.h>

int main()
{   
    INPUT ip;

    // Time to focus the program
    Sleep(5000);

    ip.type = INPUT_KEYBOARD;
    ip.ki.dwFlags = KEYEVENTF_SCANCODE;

    //'w'
    ip.ki.wScan = 0x11;
    SendInput(1, &ip, sizeof(INPUT));

    ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
    SendInput(1, &ip, sizeof(INPUT));
    return 0;
}

这个简单的程序将在5秒后输入字母&#39; w&#39;进入记事本(或cmd或您的浏览器的地址栏或其他任何内容 - 任何文本输入似乎都可以正常工作。)现在,在游戏中,如果我有拍摄&#39;设置为&#39; w&#39;,它运行正常。如果我使用屏幕键盘并按下&#39; w&#39;那里,它的工作原理。但上述节目不会导致拍摄&#39;在游戏中发生的动作。 但是,如果我将扫描码更改为0x58(&#39; F12&#39;),程序将适当地使声音在游戏中出现,就像我在实际键盘上按F12一样。

1 个答案:

答案 0 :(得分:0)

似乎问题在于,虽然文本输入通常从缓冲区中提取输入,但实时游戏会错过按键,其速度与虚拟键盘按下它们一样快。解决方案只是在按键和键盘之间添加对Sleep()的短暂调用。

此外,对于任何喜欢我在Python工作的人来说,尝试过经常建议的SendKeys.py但没有成功,请查找“playkeys”&#39;函数在代码中并在key_down(vk)之后添加time.sleep(pause),这应该可以解决问题(对我有用)。