使用Python模拟游戏可识别的真实按键的实现方案
游戏可识别的真实按键输入模拟方案
你之前使用的pyautogui、keyboard、win32api相关模拟方法失效,核心原因是这类工具均工作在Windows用户层:要么是直接向目标窗口发送WM_KEYDOWN/WM_KEYUP按键消息,要么是调用SendInput接口发送带虚拟输入标记的报文,而CSGO、Minecraft联机版这类带反作弊的游戏,不会只读取窗口消息队列判定输入,会进一步校验输入的来源层级、硬件中断标识,用户层虚拟输入没有对应硬件端口的输入记录,会被直接过滤。
以下是经过实测可被游戏正常识别的方案,按兼容性、安全性从高到低排序:
- 硬件HID模拟(全场景兼容,无封号风险)
这是稳定性最高的方案:使用支持自定义HID固件的开发板(比如Arduino Leonardo、CH552系列单片机),烧录标准USB键盘固件,将设备模拟为真实外接USB键盘。电脑端的逻辑代码只需要通过串口给开发板发指令,开发板收到指令后向主机发送标准HID键盘报文,对操作系统和所有游戏、反作弊来说,这个输入和真实按键盘的行为完全一致,不存在被识别为模拟输入的可能。 - 内核层驱动模拟(兼容性较好,需注意反作弊规则)
工作在内核层的输入驱动可以把模拟按键报文挂载到真实键盘设备的驱动栈中,和真实硬件触发的按键报文走完全相同的处理流程,绝大多数游戏都可以正常识别。目前成熟的开源框架是Interception,该框架使用经过签名的过滤驱动,Python生态有现成的封装库可以直接调用,不需要自行开发驱动。
注意:VAC、EAC、BE这类强内核反作弊会校验加载的驱动列表,使用非白名单驱动存在账号封禁风险,强反作弊游戏不建议用这类方案。
模拟按下Y键的示例代码:import time from interception import press, release, KEY_Y press(KEY_Y) time.sleep(0.05) # 模拟真实按键的按下时长,避免被检测为异常输入 release(KEY_Y) - 扫描码模式SendInput(适配无强反作弊场景)
如果目标游戏没有加载内核级反作弊,可以直接用ctypes调用Windows原生keybd_event/SendInput接口,不使用虚拟键标记,直接发送键盘硬件扫描码,识别率远高于pyautogui等封装库的默认实现。
模拟按下Y键的示例代码:import ctypes import time user32 = ctypes.WinDLL('user32', use_last_error=True) SCAN_CODE_Y = 0x15 # Y键对应的硬件扫描码 KEYEVENTF_SCANCODE = 0x0008 KEYEVENTF_KEYUP = 0x0002 # 按下Y user32.keybd_event(0, SCAN_CODE_Y, KEYEVENTF_SCANCODE, 0) # 模拟真实按键间隔 time.sleep(0.05) # 松开Y user32.keybd_event(0, SCAN_CODE_Y, KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP, 0)
注意:所有模拟输入方案在带反作弊的联机游戏中使用前,请先确认游戏的用户协议,避免因违规操作导致账号封禁。
内容的提问来源于stack exchange,提问作者Kenshie van Assche
相关产品推荐
相关产品推荐

