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

2024-05-15 16:07:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我尝试过的事情: Python:

  • keybd_事件
  • 发送密钥
  • 发送输入

C++:

  • 使用wVk发送输入
  • 在KEYEVENTF_SCANCODE标志打开的情况下,发送输入直接向wScan输入十六进制扫描代码
  • 使用MapVirtualKey为wScan转换字符的SendInput(KEYEVENTF_SCANCODE flag on)

我在谷歌上搜索过这个问题,几乎所有人都指出了上述方法。它们都能很好地将文本输入到记事本或其他文本输入中(例如,向上箭头在命令提示符下很好地工作,可以启动最后一个命令输入)。他们也能很好地将角色发送到游戏中,你可以把你的名字放在高分榜上。在

我也可以成功地发送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秒后,在记事本上输入字母'w'(或者cmd或者你浏览器的地址栏或者其他什么-任何文本输入都可以)现在,在游戏中,如果我把shoot设置为'w',它就可以正常工作了。如果我用屏幕上的键盘按“w”键,就可以了。但上述程序不会导致“射击”动作在游戏中发生。 但是,如果我将扫描码改为0x58('F12'),程序将适当地使声音在游戏中响起,就像我在实际键盘上按了F12一样。在


Tags: 方法文本命令程序ip游戏input屏幕
1条回答
网友
1楼 · 发布于 2024-05-15 16:07:51

问题似乎是,虽然文本输入通常从缓冲区中提取输入,但实时游戏将错过那些来去匆匆的按键,就像虚拟键盘按下它们一样快。解决方案只是在keypress和keyup之间添加一个简短的Sleep()调用。在

另外,对于像我这样在Python工作的人来说,尝试了通常建议的发送键.py如果没有成功,请在代码中查找“playkeys”函数并添加时间。睡觉(暂停)在按键按下(vk)后,这应该可以解决问题(它对我有效)。在

相关问题 更多 >