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

Python 以编程方式将键盘输入发送到Windows中的图形应用程序(游戏),python,c++,windows,input,automation,Python,C++,Windows,Input,Automation,我想能够使用程序/脚本自动发送键盘控制到一个非常简单的视频游戏。只有3个按钮需要工作,它们可以是任意3个键盘按钮(键绑定可以在游戏中更改)。控制基本上是左,右,射击 我尝试过的事情: Python: keybd_事件 发送键 发送输入 C++: 使用wVk发送输入 SendInput直接将十六进制扫描代码输入到wScan,且KeyEventFu扫描代码标志处于打开状态 SendInput使用MapVirtualKey转换wScan的字符(KEYEVENTF_扫描码标志打开) 几乎无论我用

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

我尝试过的事情: Python:

  • keybd_事件
  • 发送键
  • 发送输入
C++:

  • 使用wVk发送输入
  • SendInput直接将十六进制扫描代码输入到wScan,且KeyEventFu扫描代码标志处于打开状态
  • SendInput使用MapVirtualKey转换wScan的字符(KEYEVENTF_扫描码标志打开)
几乎无论我用谷歌搜索这个问题,每个人都指向上述方法。它们都能出色地将文本输入记事本或其他文本输入(例如,向上箭头在命令提示符下工作正常,显示最后一个命令输入)。他们也可以很好地将角色发送到游戏中你将名字放在高分列表中的区域

我还可以在游戏运行时成功发送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;
}
#包括
int main()
{   
输入ip;
//是时候关注节目了
睡眠(5000);
ip.type=输入\键盘;
ip.ki.dwFlags=KEYEVENTF_扫描码;
//“w”
ip.ki.wScan=0x11;
SendInput(1,&ip,sizeof(INPUT));
ip.ki.dwFlags=KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
SendInput(1,&ip,sizeof(INPUT));
返回0;
}
这个简单的程序将在5秒钟后,在记事本(或cmd或浏览器的地址栏或其他任何东西)中键入字母“w”——任何文本输入似乎都可以正常工作。现在,在游戏中,如果我将“射击”设置为“w”,它就可以正常工作。如果我使用屏幕上的键盘并在那里按“w”,它就会工作。但上述程序不会导致游戏中出现“射击”动作。
但是,如果我将扫描码更改为0x58(“F12”),程序将在游戏中适当地发出声音,就像我在实际键盘上按F12一样。

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


此外,对于像我这样使用Python的人,如果他们尝试了经常建议的SendKeys.py,但没有成功,请在代码中查找“playkeys”函数并添加time.sleep(暂停)在按下键(vk)后,这应该可以解决问题(它对我有效)。

getAsyncKeyState()在C++中可能会工作,虽然你不是很清楚你在问什么……当然不是我要找的,对不起。我不知道怎样才能解释得更清楚。我正在尝试在Windows上自动将键盘输入发送到一个简单的街机游戏。我想要一个可以,例如,为我键入“w”的程序。我发现很多方法(上面列出的)在简单的文本输入区域中都能很好地做到这一点,但在图形游戏中却不行。所有其他类似的问题似乎都遇到了与我相同的问题,收到了相同的(不起作用)建议,然后沉默而没有解决。你可以试试这个